是“int i = x ++,j = x ++;”法律?

时间:2010-10-31 02:47:29

标签: c initialization operator-precedence sequence-points

我认为标题中很清楚。我对此并不完全确定,而且我无法通过谷歌找到一个好的答案(唉,我还没有致力于标准的精美艺术),所以我问:

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

这是定义的吗? 我很确定 i = x++, j = x++; 作为正常语句将是未定义的行为是逗号运算符,这是一个序列点并且是合法的,但没有来源很清楚初始化程序是以分号结束还是一旦下一个变量开始被声明,并且由于那不是逗号运算符,我找不到明确的答案。所以要么a)逗号结束初始化器,是一个序列点,这是有效的,或者b)它没有。这是什么?

为了排除,我知道我应该简化头痛并将其写成:

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

并保证已定义。我出于好奇而要求更多。

2 个答案:

答案 0 :(得分:11)

初始值设定项的结尾是序列点,因此标题中的示例是合法的。

逗号运算符也是一个序列点,因此您的“正常语句”合法且定义明确。

The wikipedia article has a list of the C and C++ sequence points.

为了跟进下面的评论,这里演示了逗号运算符的可怕功能,保存在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

答案 1 :(得分:-5)

这是一个棘手的问题。 如果你写了:

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

我说过:它未定义。 (各种C和C ++标准保持未定义)

但是在一个初始化程序中我不确定;我已经得出结论它是不确定的,但谁知道......

安吉洛