[英]Expression evaluation in C
while ((x[num++] = getchar()) != ' ');
這一次讀取一個字符並在遇到空格時停止。 但是它如何評估帶有空格的括號呢? 括號的結果是什么? 所以基本上,這( x[num++] = getchar()
)等於什么,以便將其與空格進行比較?
我在我的一本 class 書中找到了這個例子,它是不同的,我收到了一個警告,所以我想這是一個不好的做法,是嗎? go這里怎么評價? 它是否首先將讀取值分配給x[num]
然后將其與空間進行比較?
while(x[num++] = getchar() != ' ');
在 C 中, a = b
是一個表達式。 它將b
分配給a
,然后返回a
。 因此,while循環中的條件意味着:
getchar()
獲取用戶的輸入getchar
的結果分配給x[num]
。num
增加 1x[num]
是否不等於空格' '
。IE
while (true) {
x[num] = getchar();
num ++;
if (!(x[num] != ' '))
break;
}
第二個示例具有完全不同的行為。 這是因為!=
表達式將在不帶括號的賦值=
之前計算。 因此,第二個例子意味着
getchar()
獲取用戶的輸入x[num]
是否不等於空格' '
。true
或false
)分配給x[num]
num
增加 1 警告是因為很容易錯誤地將while (a = b)
寫成表示while (a == b)
。
這兩個版本都不是好的編碼; 兩者都忽略了在讀取空間之前到達 EOF 的可能性,並且都忽略了在讀取空間之前溢出緩沖區的可能性。
第一個在其他方面是正確的。 它包含一個任務:
x[num++] = getchar()
賦值的結果是賦值。 因此,如果getchar()
返回“X”,則賦值結果為“X”。 然后將賦值結果與空白進行比較; 它們是不同的,循環重復。 如果getchar()
返回一個空白,那么賦值的結果也是一個空白,空白等於空白,所以循環終止。
第二個是完全錯誤的。 因為賦值的優先級低於!=
,所以結果就像代碼讀取一樣:
while (x[num++] = (getchar() != ' '))
;
也就是說, getchar()
讀取一個字符並與空白進行比較,如果字符不是空白則生成值 1,如果是空白則生成值 0。 這個 0 或 1 分配給x[num++]
,然后作為邏輯條件進行評估。 如果結果為 0,則循環終止; 如果結果為 1,則循環繼續。 請注意,讀取的字符未記錄在此版本中 - 這就是編譯器發出警告的原因。 這幾乎總是一個錯誤。 在那些奇怪的情況下,如果它不是一個錯誤,你可以告訴編譯器,通過提供額外的括號來讓編譯器清楚你的意圖 - 以及你的觀眾,其他將閱讀你的代碼的人。 (記住:如果你在 6 個月,甚至 6 周后回來,你會變成一個不同的人,可能很難記住這些微妙之處。讓每個人都明白。在過度括號之間有一個很好的平衡和括號內的代碼。)
代碼可能應該是:
int c;
int max = sizeof(x) - 1;
int num = 0;
while ((c = getchar()) != EOF && num < max && (x[num++] = c) != ' ')
;
請特別注意, c
必須是int
而不是char
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.