簡體   English   中英

C條件語句

[英]C Conditional Statement

我遇到了以下代碼。

int main()
{
  int i=1,j=2;
  int a=i--?printf("%d",i):j--;
  printf(" %d %d %d",i,j, a);
  return 0;
}

輸出為0 0 2 1。

我理解除前0之外的其余輸出。

請幫忙。

謝謝。

第一個0i的值,該值被初始化為1然后在第二行中遞減。

更明確地說:

i = 1
(i--) - evaluates as True, then sets i to 0
printf("%d ", i) = prints '0'
j--   - skipped
printf("%d %d %d", i, j, a)
print i: 0
print j: 2 (unchanged)
print a: return value of first `printf` : character count (1)

正如@tristopia在評論中指出的那樣,這里有兩個密切相關的概念在起作用:

  1. 后綴運算符:表達式中使用的值是增量發生之前的值...
  2. 順序點:代碼中“將執行先前評估的所有副作用”的點-換句話說,“所有需要發生的事情都將在我們通過此點之前發生”。 例如,當您傳遞序列點時,保證在后綴增加的任何變量都將增加(並存儲)。

這里的關鍵是? 三元運算符的一個就是這樣一個序列點-因此,在您進入printf語句之前,您確定i會被減一。

將此與以下代碼進行對比:

i = 1;
a = 5 * i++ + (i = 2 * i--);

這將導致不確定的行為-C標准中沒有任何內容可以明確地告訴您上述條件之后ai的值。 什么時候應該將i++的值存儲回i 遞減運算之前? 我們將結果分配給i的事實怎么樣? 是在其他“隱式存儲”操作之前還是之后? 大多數編譯器在遇到此類錯誤時都會發出警告-如果您牢記特定的操作順序,則應通過重寫代碼來“強制序列點”。

在進行條件檢查之前,i的值不會減小(由於后綴減小)。 當i為1時,測試評估為true,從而導致執行printf。 但是就像i的測試結束一樣,它也會遞減,這就是printf在屏幕上打印的內容。

好吧,您兩次調用printf() 條件運算符中的第一個輸出i (0)的值。 當您創建變量a它的默認值為0,並且在將i--遞減后, i變為0,因此條件通過了。

然后,您有了第二個printf() ,它會與其他2個值一起再次打印i

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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