簡體   English   中英

類似於“for(i = 1; i <= 10; printf(”%d \\ n“; i),i ++)在C中有效且無UB嗎?

[英]Is something like “for(i=1;i<=10;printf(”%d\n";i),i++) valid and UB-free in C?

以下兩個代碼塊完全相同並實現相同的功能嗎?它在運行程序時顯示相同的內容,但我要感謝一些嚴格的解釋。

for(i=1;i<=10;i++)
{
printf("%d\n",i);
}

for(i=1;i<=10;printf("%d\n",i),i++);

for循環期望有效的C語句作為參數,不是嗎? 但即使我已經在StackOverflow上驗證了x+=4,y=x*2;等語句x+=4,y=x*2; 這里的逗號充當序列點是安全的,對於在上面的for循環中作為參數傳遞的語句printf("%d\\n",i),i++)是否相同?

如果是,請費心回答由此產生的小問題:

  • comma是否在包含許多逗號分隔的語句中充當序列點

    函數調用如下:

    printf("Enter number\\n"),scanf("%d",&number),printf("You entered %d",number);

這是完全有效的,兩個語句都等於編譯器。 對於讀者來說,第二個幾乎是不可讀的,所以這是唯一的區別。 使用第二種格式沒有多大意義。

序列點由逗號運算符引入。

參考:

6.5.17逗號運算符

第2段:

逗號運算符的左操作數被計算為void表達式; 它的評估與右操作數之間存在一個序列點。 然后評估右操作數; 結果有它的類型和價值.144)

答案是C標准的6.8.5.3

1774聲明

  for ( clause-1 ; expression-2 ; expression-3 ) statement 

表現如下:

1775表達式> expression-2是在每次執行循環體之前計算的控制表達式。

1776在每次執行循環體后,表達式-3被計算為void表達式。

1777如果子句1是一個聲明,它聲明的任何標識符的范圍是聲明的剩余部分和整個循環,包括其他兩個表達式;

1778在控制表達式的第一次評估之前按執行順序到達。

1779如果子句-1是一個表達式,則在第一次評估控制表達式之前將其計算為void表達式。

1780可以省略clause-1和expression-3。

1781省略的表達式-2被非零常量替換。

在執行printf語句和i的遞增之間建立了一個序列點。 在這種情況下, printf語句和iexpression-3 ,而不是條件語句,因此該語句雖然不是最佳實踐,但仍然有效。

暫無
暫無

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

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