C语言 - 没有赋值,x+1是什么意思?

5
我的问题可能很简单,但是我想知道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++编译器,因此可能会得到其他值。

提前感谢:)


7
这是一个 NOP 操作,将被编译器优化掉。 - πάντα ῥεῖ
4
由于短路和将“0”解释为“假”,该作业不会被评估。 - jaggedSpire
1
@jaggedSpire 啊,那个放在 if() 条件里的。 - πάντα ῥεῖ
1
@tdbr 这个if语句中的赋值操作 (x = 7) 永远不会被执行,因此这个条件永远不会成立。 :) - Vlad from Moscow
2
@tdbr 如果and(与)的一个输入为false(假),那么结果将是false(假)。另外,短路行为是在标准中指定的行为。 - jaggedSpire
显示剩余8条评论
4个回答

4
操作1后内存的样子是什么样子?
它与操作之前相同。`x-1`是一种没有副作用的表达式(即它不会修改任何变量)。语句`x-1;`评估该表达式并丢弃结果。任何体面的编译器都会将其优化掉。
要将`x`增加`1`,您应该使用复合赋值运算符 `+=`:
x += 1;

使用增量运算符++也可以实现相同的效果:
x++; // these do the same
++x; // thing in this case

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

x - 2之后,x的值会改变吗?

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

然而,如果赋值语句x = 7被评估(当&&的左操作数评估为true或非零时发生,这称为短路求值),则将x的值更改为7。在这种情况下,左操作数评估为零,因此x = 7不会被评估。

请注意,=运算符与等于比较运算符==是不同的:

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

2
这个任务将不会被评估,因为x-2的结果是false。 - P.P
@usr 在他们的回答中确实提到了这一点。 - jaggedSpire
与其使用x += 1;,我更倾向于使用++x;。它更简洁,表达的意思也一样清晰。 - Jesper Juhl
将“这些做的是同样的事情”放在前缀和后缀增量旁边很可能会被误解。也许可以加上“在这种情况下”或者重新表述一下。 - Fantastic Mr Fox
@FantasticMrFox 谢谢。已经修复了。 - emlai
@JesperJuhl 谢谢。我也添加了那个。 - emlai

4
代码
x+1;

对表达式进行评估,然后仅丢弃结果是合法的,但是好的编译器应该发出警告(如果我没记错的话,g ++会发出有关需要副作用才能有用的表达式的内容)。

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

像这样的代码

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

如果在C++中使用并修改同一值的不同部分(如果这些部分没有规定的评估顺序),则其行为将是未定义的行为,因为C++不要求按顺序处理子表达式(除了逗号运算符,、逻辑与&&、逻辑或||和三元运算符?:)。编译器不需要对此进行投诉。无论发生什么情况,都是程序员的错误。


嗯...你确定吗?我认为连词会检查&&两侧的语句,因为仅当两侧都为真或以任何其他方式都为假时,语句才为真。 - tdbr
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - 6502

3
这意味着“执行这个计算并丢弃结果”。
在您的情况下,编译器可能会完全删除代码(因为它显然没有副作用)。但如果operator+被重载和/或涉及用户定义类型,则可能存在有意义的副作用,并且代码可能是有意义的,并将被保留以执行这些操作。

1

x + 1 不会改变 x 的值。x + 1 的结果为 3,但结果被忽略。

对于 && 运算符,计算顺序是从左到右。只要 && 运算符的组成部分都为 true,则下一个组成部分将被计算。

与 x + 1 类似,x + 2 也不会改变 x 的值。在您的情况下,x - 2 的结果为零,因此下一个组成部分不会被计算。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接