5

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

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

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

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

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

并保证它已定义。出于好奇,我问得更多。

4

2 回答 2

11

初始化器的结尾是一个序列点,因此标题中的示例是合法的。

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

维基百科文章有一个 C 和 C++ 序列点的列表。

为了跟进下面的评论,这里展示了逗号运算符的强大功能,保存在 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
于 2010-10-31T02:50:24.157 回答
-5

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

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

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

但是在初始化程序中,我不确定;D ofc 我已经得出结论,它也存在未定义,但谁知道......

安杰洛

于 2010-10-31T02:51:29.783 回答