簡體   English   中英

C 中的表達式評估

[英]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循環中的條件意味着:

  1. 調用getchar()獲取用戶的輸入
  2. getchar的結果分配給x[num]
  3. num增加 1
  4. 檢查x[num]是否不等於空格' '

IE

while (true) {
  x[num] = getchar();
  num ++;
  if (!(x[num] != ' '))
    break;
}

第二個示例具有完全不同的行為。 這是因為!=表達式將在不帶括號的賦值=之前計算。 因此,第二個例子意味着

  1. 調用getchar()獲取用戶的輸入
  2. 檢查x[num]是否不等於空格' '
  3. 將步驟 2 中的結果( truefalse )分配給x[num]
  4. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM