Chr*_*utz 5 c initialization operator-precedence sequence-points
我认为标题中很清楚.我对此并不完全确定,而且我无法通过谷歌找到一个好的答案(唉,我还没有致力于标准的精美艺术),所以我问:
int i = x++, j = x++;
Run Code Online (Sandbox Code Playgroud)
这个定义了吗?我很确定i = x++, j = x++;正常语句是未定义的行为是逗号运算符,它是一个序列点并且是合法的,但没有一个来源很清楚初始值设定项是以分号结束还是一旦下一个变量开始被声明,因为那不是逗号运算符,我找不到明确的答案.所以要么a)逗号结束初始化器,是一个序列点,这是有效的,或者b)它没有.这是什么?
为了排除,我知道我应该简化头痛并将其写成:
int i = x++;
int j = x++;
Run Code Online (Sandbox Code Playgroud)
并保证它已定义.我出于好奇而要求更多.
Ben*_*son 11
初始化程序的结尾是一个序列点,因此标题中的示例是合法的.
逗号运算符也是一个序列点,因此您的"正常语句" 也是合法且定义明确的.
为了跟进下面的评论,这里演示了逗号运算符的可怕功能,保存在FreeBSD的stdio.h(下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
Run Code Online (Sandbox Code Playgroud)