编译器如何解释增量前/减量和增量后/减量
How the compiler interprets preincrement/decrement and postincrement/decrement
当有人询问后增量/减量和前增量/减量之间的区别时,通常的回答是前缀版本向变量添加一个并返回变量的新值,而后缀版本向变量增加一个并返回旧值。
在闲逛的时候,我发现所有这些线路都是合法的:
int i = 1;
++i;
++++++++++++++i;
(++++++++++++++i)++;
(++++++(++++(++i)))++;
------i;
--++++--++----++i;
i+=++++++++++++++i+i++-i--;
但以下线路都不合法:
i++++;
++i++;
--i--;
如果我假设前缀版本通过引用返回,这一切都是有意义的(即使是最后一个例子,因为后缀的优先级高于前缀)。
前缀版本返回引用,后缀版本返回值的假设/实现是否正确?对于前置/后置inc/减量运算符,是否还有我不知道的其他细微行为差异?
所有这些都是合法的:
不,这是不合法的。以这种方式多次写入变量是"未定义行为"。它在语法上是正确的,它会编译,但它肯定是不合法的。
在C++中,前缀递增/递减表达式"return"lvalues和后缀版本返回rvalues。在C中,两种形式都返回右值。
但是,请注意,如果您试图在两个序列点之间多次写入变量,则行为是未定义的。所以这种区别其实并不重要。
脑海中浮现的一个常见编码错误是,在同一语句中至少使用两次变量,其中至少有一个实例应用了前/后增量:
i = i++;
假设/认识到前缀版本返回引用,并且后缀版本返回一个值正确的
没有。你为什么会这么想?它是一个内置的运算符,编译器可以随心所欲地实现它。
您的"合法"示例可能会编译,但会产生未定义的行为,因为您在没有序列点的情况下多次读取和写入同一变量。
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- Python中的for循环与C++有何不同
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 你能解释一下什么运行时错误是如何解决它的吗?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- 在C++中释放内存期间,迭代器与指针有何不同
- 在 C++ 中解释多维向量的语句时感到困惑
- 解释一下 for (char c : str) 的作用?
- 编译器如何解释增量前/减量和增量后/减量