结构成员初始化之间是否存在序列点?

Jon*_*ess 7 c sequence-points language-lawyer

结构成员初始化表达式之间是否有一个序列点?

例如,是否明确定义下面的代码将始终打印"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;
}
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 6

我认为§6.7.8-23解决它:

初始化列表表达式中出现任何副作用的顺序是未指定的.

关于复合文字:

§6.5.2.5-7

6.7.8中初始化列表的所有语义规则和约束都适用于复合文字.