Chả có gì lạ cả. Trong C/C++, phép gán cũng là một biểu thức và biểu thức ấy có giá trị bằng giá trị của vế phải trước khi thi hành phép gán (và cũng chính là giá trị vế trái sau khi thi hành phép gán).
Như thế phép gán c=getchar() cũng là một biểu thức và có giá trị bằng giá trị của getchar() trước khi thi hành phép gán, tức là giá trị của c sau khi thi hành phép gán.
Giả sử lời gọi getchar() cho ký tự 'A', thì sau đó chương trình sẽ:
- Thi hành phép gán c=getchar(), kết quả là c sẽ có giá trị 'A'.
- Đánh giá biểu thức c=getchar(), biểu thức này sẽ có giá trị là 'A'.
- Đánh giá biểu thức (c = getchar()) != DAU_CHAM, nói cách khác 'A' != '.' và kết quả sẽ là 1 (tức là "đúng").
Còn giả sử lời gọi getchar() cho ký tự '.' thì sau 3 bước tương tự như trên cuối cùng kết quả sẽ là 0 (tức là "sai").