我的问题可能很简单,但我想知道这个x + 1是什么意思? 我们来看一个例子:
int main()
{
int x = 2;
x + 1; //1
if ((x - 2) && (x = 7)) { //2 and 3
// do something
}
}
我所知道的:
问题:
我在调试器中看到这不会改变x的值,但我在Visual Studio中使用C ++编译器,因此它可以提供其他值。
提前致谢:)
答案 0 :(得分:4)
操作1后内存如何?
与手术前相同。 x - 1
是一个没有副作用的表达式(即它不会修改任何变量)。语句x - 1;
评估表达式并丢弃结果。任何体面的编译器都会优化它。
要x
增加1
,您应该使用compound assignment operator +=
:
x += 1;
使用递增运算符++
:
x++; // these do the same
++x; // thing in this case
在其他情况下,++
的两个不同版本具有不同的含义,请参阅What is the difference between prefix and postfix operators?。
x的值是否在x-2(2)之后发生了变化?
x - 2
本身并未更改x
的值。 (再次x -= 2
可以用来实现这一点。)
但是,如果评估了分配,则分配x = 7
会将x
的值更改为7
(如果&&
的左侧评估为true
或非零(这称为short-circuit evaluation)。在这种情况下,左侧评估为零,因此不评估x = 7
。
请注意,=
运算符与等于比较运算符==
不同:
x == 7 // evaluates to `true` if the value of `x` is equal to `7`, and to `false` otherwise.
答案 1 :(得分:4)
代码
x+1;
评估表达式,然后删除结果。它是合法的,但是一个好的编译器应该发出一个警告(IIRC g ++会发出一些关于需要副作用的表达式的东西)。
代码(x - 2) && (x = 7)
却没有做任何事情,因为&&
是"短路"并且x-2
在逻辑上下文中是错误的。因此,不评估代码(x = 7)
。 &&
和||
首先评估左侧,只有在无法确定结果的情况下评估右侧...例如(1 || foo())
保证跳过对函数的调用{ {1}}。
代码
foo
将是未定义的行为,因为C ++不需要按顺序处理子表达式(逗号运算符y = (x - 2) * (x = 7);
除外,逻辑AND ,
,逻辑OR &&
和三元运算符||
)并且在表达式的不同部分使用和修改相同的值(如果这些部分没有规定的评估序列)是不允许的,但编译器不需要抱怨它。无论发生什么事情,都是程序员的错。
答案 2 :(得分:3)
这意味着“执行此计算并丢弃结果”。
在你的情况下,这意味着编译器可能只是完全删除代码(因为它显然没有副作用)。但是如果operator +已经过载和/或涉及用户定义的类型,那么可能会产生有意义的副作用,并且代码可能是有意义的并且将被保留以执行这些操作。
答案 3 :(得分:1)
x + 1不会改变x的值。计算x + 1 viz 3的结果,然后忽略结果。
对于和(&&)评估序列是从左到右。只要&&和operator为true,将评估下一个组件。
如前面针对x + 1所述,类似地,x + 2不会改变x的值。在你的情况下,x - 2结果为0即0。零,因此不评估下一个组件。
C语言的基本原理在所有编译器中保持相同,IDE(在您的情况下为Visual Studio)对编译没有影响