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

时间:2017-01-30 17:38:17

标签: c++ c

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

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

我所知道的:

  • 无法评估作业,因为&&amp ;;的左侧将返回false,因此连接永远不会成立。

问题:

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

我在调试器中看到这不会改变x的值,但我在Visual Studio中使用C ++编译器,因此它可以提供其他值。

提前致谢:)

4 个答案:

答案 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)对编译没有影响