请考虑以下C++标准ISO/IEC 14882:2003(E)引用(第5节,第4段):
除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.53)在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.[例:
Run Code Online (Sandbox Code Playgroud)i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented- 末端的例子]
我很惊讶,i = ++i + 1给出了一个未定义的值i.有没有人知道编译器实现不能给出2以下情况?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
Run Code Online (Sandbox Code Playgroud)
事情是operator=有两个args.第一个总是i参考.在这种情况下,评估顺序无关紧要.除了C++ Standard禁忌之外,我没有看到任何问题.
请,不要不考虑这样的情况下,参数的顺序是评价非常重要.例如, …
我最近了解了,运算符以及引入序列点的事实.
我还了解到以下代码导致了未定义的行为:
i = ++i;
Run Code Online (Sandbox Code Playgroud)
因为i在两个序列点之间修改了两次.
但是下面的代码怎么样?
i = 0, ++i;
i = (0, ++i);
Run Code Online (Sandbox Code Playgroud)
虽然我知道规则,但我无法得出结论.它是否定义了行为?
编辑:就像@paxdiablo提到,定义与否,这是一个应该避免的不好的做法.这个问题仅用于教育目的和更好地理解"规则".
为什么以下给定的表达式会调用未定义的行为?
int i = 5;
i = (i,i++,i) + 1
Run Code Online (Sandbox Code Playgroud)
我的问题在这里受到Als问题的影响
下面有一个代码,我在理解代码的逻辑时遇到了一个非常严重的问题.
#include <stdio.h>
#include <stdlib.h>
int main(void )
{
int i = 1 ;
printf("\n%d %d %d %d\n",++i,i++,i++,++i) ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
我在linux发行版下使用名为Mandriva的gcc编译器.在上面提到的我在printf语句中使用了一个变量的pre和post增量.我应该得到的输出是2 2 3 5,但我得到一个不同的输出.请帮我这个代码.
我觉得这段代码很难.
int x = 0;
x^=x || x++ || ++x;
Run Code Online (Sandbox Code Playgroud)
x的答案最后是3.如何分析这个表达式?对此有点困惑.非常感谢.