2013-05-05 113 views
0

17頁C程序設計語言(第二版)作家說的!=讓渡,而不是平等的優先級

優先比的=

更高所以當我想測試它時,並不是那樣。這是我的簡單程序:

#include <stdio.h> 

int main() { 
    int inp; 

    while(inp = getchar() != EOF) { 
     putchar(inp); 
    } 
} 

我試圖讀取輸入並將其顯示給用戶。當我嘗試,沒有發生,屏幕是空的,但是當我嘗試這一個,一切工作正常:

#include <stdio.h> 

int main() { 
    int inp; 

    while((inp = getchar()) != EOF) { 
     putchar(inp); 
    } 

} 

出了什麼事?我有gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

+3

如果優先級較高,是不是會被解釋爲'inp =(getchar()!= EOF)'? – Blender 2013-05-05 06:56:06

+4

請注意,'='不等於「等於」。它是分配操作員。 '=='是「等於」。 – 2013-05-05 07:02:51

回答

11

發生了什麼事情正是你在說的,The precedence of != is higher than that of =

這意味着,!=結合更難=

while(inp = getchar() != EOF) { 

相當於;

while(inp = (getchar() != EOF)) { 

,將設置inp來比較,不是你要找的字符值布爾值。

+0

但他們不適合我。 – 2013-05-05 06:57:25

+1

@AshshinMehrabani他們不應該。使其工作的方式是用括號'(inp = getchar())!= EOF'來覆蓋優先級,就像你在工作的例子中一樣。它將字符賦給字符,_then_比較賦值的結果。 – 2013-05-05 06:58:30

+0

對不起,我的錯。謝謝哥們 :) – 2013-05-05 07:38:52

1

你的兩個條件是等價於:

char notEndOfFile = (getchar() != EOF); // notEndOfFile is a boolean 
if(!(inp = notEndOfFile)) // inp is now a boolean, not the character input 
    break;     // break if notEndOfFile is false 

這將終止在正確的時間,但可根據需要不INP分配。

和:

inp = getchar();  // As desired 
if(inp != EOF) break // break if inp is EOF 

終止和InP正確地分配。