"Int i = x ++, j = x ++;"законно? - PullRequest
       29

"Int i = x ++, j = x ++;"законно?

5 голосов
/ 31 октября 2010

Довольно ясно в названии, я думаю. Я не совсем уверен в этом, и я не могу найти хороший ответ через Googles (увы, я не привержен изобразительному искусству стандартов фу), поэтому я спрашиваю:

int i = x++, j = x++;

Это определено? Я вполне уверен, что i = x++, j = x++; как обычное выражение будет неопределенным поведением является оператором запятой, который является точкой последовательности и будет допустимым, но ни один источник не совсем понятен заканчивается ли инициализатор точкой с запятой или когда начинает объявляться следующая переменная, и, поскольку это не оператор запятой, я не могу найти четкого ответа. Так что либо а) запятая завершает инициализатор, является точкой последовательности, и это работает, либо б) это не так. Что это?

И, для исключения, я знаю, что должен упростить головную боль и просто написать это как:

int i = x++;
int j = x++;

И гарантируем, что оно определено. Я спрашиваю больше из любопытства.

Ответы [ 2 ]

11 голосов
/ 31 октября 2010

Конец инициализатора - точка последовательности , поэтому пример в заголовке допустим.

Оператор запятой также является точкой последовательности, так что ваше "нормальное утверждение" также допустимо и четко определено.

В статье в Википедии есть список точек последовательности C и C ++.

Чтобы прокомментировать приведенный ниже комментарий, приведем демонстрацию пугающей силы оператора запятой, сохраненного в stdio.h FreeBSD (под ifndef __GNUC__):

/*
 * This has been tuned to generate reasonable code on the vax using pcc.
 */
#define __sputc(c, p) \
        (--(p)->_w < 0 ? \
                (p)->_w >= (p)->_lbfsize ? \
                        (*(p)->_p = (c)), *(p)->_p != '\n' ? \
                                (int)*(p)->_p++ : \
                                __swbuf('\n', p) : \
                        __swbuf((int)(c), p) : \
                (*(p)->_p = (c), (int)*(p)->_p++))
#endif
0 голосов
/ 31 октября 2010

Это сложный вопрос.Если бы вы написали:

int i = 0, j = 0, x = 10;
i = x++, j = x++;

Я сказал: это не определено.(Различные стандарты C и C ++ сохраняют это неопределенным)

Но в инициализаторе я не уверен; D ofc Я пришел к выводу, что он там тоже не определен, но кто знает ...

Angelo

...