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

tdb*_*dbr 5 c c++

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

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

我知道的:

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

问题:

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

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

提前致谢 :)

650*_*502 4

代码

x+1;
Run Code Online (Sandbox Code Playgroud)

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

相反,该代码(x - 2) && (x = 7)不执行任何操作,因为&&它是“短路的”并且x-2在逻辑上下文中为 false。所以代码(x = 7)没有被评估。&&||首先评估左侧,只有当无法从中确定结果时才评估右侧...例如,(1 || foo())保证跳过对 function 的调用foo

代码如下

y = (x - 2) * (x = 7);
Run Code Online (Sandbox Code Playgroud)

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

  • @tdbr:不...`&&`和`||`是特殊的...它们评估左侧,并评估右侧**仅当结果无法从左侧结果确定时**。 (2认同)