Существует ли точка последовательности между инициализациями элементов структуры? - PullRequest
7 голосов
/ 05 ноября 2011

Есть ли точка последовательности между выражениями инициализации члена структуры?

Например, правильно ли определено, что код ниже всегда будет печатать «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;
}

Ответы [ 3 ]

6 голосов
/ 05 ноября 2011

Я думаю §6.7.8-23 решает вопрос:

Порядок, в котором возникают любые побочные эффекты среди списка инициализации выражения не указаны.

А по поводу составных литералов:

§6.5.2.5-7

Все семантические правила и ограничения для списков инициализаторов в 6.7.8. применимы к составным литералам.

2 голосов
/ 05 ноября 2011

Я считаю, что соответствующая формулировка в C99 TC2 (n1124) содержится в § 6.7.8 / 23:

Порядок появления побочных эффектов в выражениях списка инициализации: неопределенные 131 .

Сноска гласит:

131) В частности, порядок оценки не должен совпадать с порядком инициализации подобъекта.

1 голос
/ 05 ноября 2011

Нет.Вы можете сами убедиться в Приложении C к стандарту C (или черновикам n1256, n1516 и т. Д.).

После каждого full декларатора есть точка последовательности, и она все еще будетточки последовательности из выражений внутри инициализации, использующих && или вызывающих функций.

Точки последовательности между аргументами функции также не существует.

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