2011-11-05 91 views
7

結構成員初始化表達式之間是否存在序列點?結構成員初始化之間是否有順序點?

例如,下面的代碼總是會打印出「a,b」嗎?

#include <stdio.h> 

typedef struct { 
    char *bytes; 
    int position; 
    int length; 
} Stream; 

typedef struct { 
    char a; 
    char b; 
} Pair; 

char streamgetc(Stream *stream) { 
    return (stream->position < stream->length) ? stream->bytes[stream->position++] : 0; 
} 

int main(void) { 
    Stream stream = {.bytes = "abc", .position = 0, .length = 3}; 
    Pair pair = {.a = streamgetc(&stream), .b = streamgetc(&stream)}; 
    printf("%c, %c\n", pair.a, pair.b); 
    return 0; 
} 

回答

6

我覺得§6.7.8-23解決了,

在初始化列表 公式中出現任何副作用的順序是unspeci網絡版。

而關於複合文字:

§6.5.2.5-7

所有6.7.8 語義規則和約束的初始化列表適用於複合文字。

1

不可以。您可以親自看看C標準附錄C(或草案n1256,n1516等)。

在每個完整的聲明符後面都有一個序列點,並且在初始化內部仍會有使用&&或調用函數的表達式中的序列點。

函數參數之間沒有序列點。

func(getc(), getc()); // who knows what order? 
2

我相信C99 TC2(n1124)的相關措辭是§6.7.8/ 23:

在初始化列表公式中出現任何副作用

的順序 不確定。

的腳註說:

131)特別是,在評估順序不一定是相同的子對象初始化的順序。

+0

我喜歡(並投票贊成)增加了腳註131,但是我選擇了較舊的答案,因爲我認爲兩者都是完整的。 –

+0

這是否意味着與不同元素相關聯的表達式的評估保證不重疊,但是任何數量的這種表達式都可以在評估任何特定元素與相應結構元素實際寫入的時間之間進行評估? – supercat