2016-01-22 49 views
4

在下面的代碼在函數調用中,爲什麼逗號不是序列點?

int main(){ 
    int a=3; 
    printf("%d %d %d",++a,a,a++); 
    return 0; 
} 

作爲指定,從C99附錄C:

以下是5.1.2.3中描述的序列點:

  • 給函數的調用,在參數評估後 (6.5.2.2)。
  • 以下操作符的第一個操作數的結尾:邏輯 AND & &(6.5.13);邏輯OR || (6.5.14);有條件? (6.5.15); 逗號(6.5.17)

函數參數的求值順序未定義,如C標準所指定。

但是,在printf的函數調用中,我們有用逗號分隔的參數,它們被分類爲序列點。那麼爲什麼這個陳述對應於未指定的行爲呢?

+1

要清楚的是:'printf'調用中的這些逗號是* not *順序點,並且它們當然不會賦予明確未定義的'a ++'和'++ a'組合上的任何明確定義。 –

回答

12

因爲逗號在函數調用comma operator分離。所以它不會引入任何序列點。

+0

逗號操作符何時起到分隔符的作用?它何時表現爲序列點? –

+2

@kevin,例如分隔符'int x [] = {1,2,3}','call(1,2,3)';序列點:'int x [] = {(1,/ * comma op */2),/ * separator */3}','call((1,/ * comma op */2)/3)'。 – kay

+4

@kevin逗號不「表現」。它是語法規則中出現*的符號。當您使用函數調用語法時,參數之間的逗號是分隔符的標記符號。在逗號表達式中,逗號表示運算符。所以這取決於你正在寫的東西遵循哪個語法規則。 – Kaz

相關問題