相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

表达式的定义行为

C99标准以6.5.2美元计价.

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.

(我强调)

它继续指出,以下示例是有效的(一开始看起来很明显)

a[i] = i;
Run Code Online (Sandbox Code Playgroud)

虽然它没有明确说明是什么ai是什么.

虽然我相信它没有,但我想知道这个例子是否涵盖以下情况:

int i = 0, *a = &i;
a[i] = i;
Run Code Online (Sandbox Code Playgroud)

不会改变值i,而是访问值i来确定放置值的地址.或者我们分配一个i已存储的值是无关紧要的i?请说清楚.


奖金问题; 怎么样a[i]++还是a[i] = 1

c standards-compliance undefined-behavior language-lawyer

11
推荐指数
1
解决办法
360
查看次数