什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我们班的C编程教授问了这个问题:
你得到的代码:
int x=1;
printf("%d",++x,x+1);
Run Code Online (Sandbox Code Playgroud)
它总会产生什么输出?
大多数学生说未定义的行为.任何人都可以帮助我理解为什么会这样吗?
感谢编辑和答案,但我仍然感到困惑.
让我们假装我的程序包含一个特定的构造,C++标准声明它是未指定的行为.这基本上意味着实现必须做一些合理的事情,但不允许记录它.但是,每次编译具有未指定行为的特定构造时是否需要生成相同的行为,或者是否允许在不同的编译中产生不同的行为?
未定义的行为怎么样?让我们根据标准假装我的程序包含一个UB结构.允许实现表现出任何行为.但是,同一编译器中相同程序的编译在同一环境中具有相同设置时,此行为是否会有所不同?换句话说,如果我在文件X.cpp中的第78行取消引用空指针,并且在这种情况下驱动器的实现格式是否意味着它将在重新编译程序后执行相同的操作?
问题是......我使用相同的编译器设置在相同的环境中使用相同的编译器编译相同的程序.构造声明是未指定的行为,未定义的行为会在每次编译时产生相同的行为,还是允许它们在编译之间有所不同?