C – x + 1表示没有赋值是什么意思?

我的问题可能很简单,但我想知道这个x + 1是什么意思? 我们来看一个例子:

int main() { int x = 2; x + 1; //1 if ((x - 2) && (x = 7)) { //2 and 3 // do something } } 

我知道的:

  • 无法评估赋值,因为&&的左侧将返回false,因此连接将永远不会为真。

问题:

  • 操作1后内存如何?
  • 在x-2(2)之后x的值是否改变了?

我在调试器中看到这不会改变x的值,但我在Visual Studio中使用C ++编译器,因此它可以给出另一个值。

提前致谢 :)

代码

 x+1; 

评估表达式,然后删除结果。 它是合法的,但是一个好的编译器应该发出一个警告(IIRC g ++发出一些关于表达的东西,这需要副作用才有用)。

代码(x - 2) && (x = 7)反而没有做任何事情,因为&&在逻辑上下文中是“短路的”而x-2是假的。 因此不评估代码(x = 7)&&|| 首先评估左侧,并且仅在不能从中确定结果时评估右侧…例如(1 || foo())保证跳过对函数foo的调用。

代码就像

 y = (x - 2) * (x = 7); 

相反,它将是未定义的行为,因为C ++不需要按顺序处理子表达式(除了逗号运算符,逻辑AND && ,逻辑OR ||和三元运算符?: ||并在不同的位置使用和修改相同的值表达式的一部分(如果这些部分没有规定的评估顺序)是不允许的,但编译器不需要抱怨它。 无论发生什么事,都是程序员的错。

操作1后内存如何?

它与操作前相同。 x - 1是没有副作用的表达式(即它不会修改任何变量)。 声明x - 1; 评估表达式并丢弃结果。 任何体面的编译器都会优化它。

要将x递增1您应该使用复合赋值运算符 +=

 x += 1; 

使用增量运算符++可以实现相同的目的:

 x++; // these do the same ++x; // thing in this case 

在其他情况下, ++的两个不同版本具有不同的含义,请参阅前缀和后缀运算符之间的区别是什么? 。

在x-2(2)之后x的值是否改变了?

x - 2本身不会改变x的值。 (同样, x -= 2可以用来实现这一点。)

但是,如果计算赋值,则赋值x = 7会将x = 7的值更改为7 (如果&&的左侧计算为true或非零,则会发生这种情况(这称为短路评估 )。左侧评估为零的情况,因此不评估x = 7 )。

请注意, =运算符与等于比较运算符==

 x == 7 // evaluates to `true` if the value of `x` is equal to `7`, and to `false` otherwise. 

这意味着“执行此计算并丢弃结果”。

在你的情况下,这意味着编译器可能只是完全删除代码(因为它显然没有副作用)。 但是如果operator +已经过载和/或涉及用户定义的类型,那么可能会产生有意义的副作用,并且代码可能是有意义的并且将被保留以执行这些操作。

x + 1不会改变x的值。 计算x + 1 viz 3的结果,然后忽略结果。

对于和(&&)评估序列是从左到右。 只要&&运算符的组件为true,就会评估下一个组件。

如前面针对x + 1所述,类似地,x + 2不改变x的值。 在你的情况下,x – 2结果为0即。 零,因此不评估下一个组件。

C语言的基本原理在所有编译器中保持相同,IDE(在您的情况下为Visual Studio)对编译没有影响