【问题标题】:C++ logical conditions inside if statementsif 语句中的 C++ 逻辑条件
【发布时间】:2021-10-24 08:17:15
【问题描述】:
int a = 2;

if((a = a-3 && --a ) || a--) 
    cout<<a<<endl;

我的疑问是,( a = a-3 && --a) 会使 a = -1 因为 a-3 = -1。左侧评估什么?如果编译器确实转到 OR 的右侧,它是从左侧获取 a 的原始值(即 2)还是 a 的修改值 此代码 1 的输出如何?引擎盖下发生了什么?是不是只执行了一侧的 if 语句?

【问题讨论】:

  • 您期望a-3 &amp;&amp; --a 的评估结果是什么? (不确定问题是运算符优先级还是短路。)
  • 是时候开始关注旧的运算符优先级表 (en.cppreference.com/w/cpp/language/operator_precedence)...对于在真实程序中编写此类代码的任何人来说,地狱中都有一个特殊的地方:)
  • 只是把它拼出来,a = a-3 &amp;&amp; --a 是,用额外的括号突出优先顺序,a = ((a-3) &amp;&amp; --a)
  • 你正在混合运算符优先级理解和布尔值Short-circuit_evaluation:你没有帮助自己学习。对于 &amp;&amp;|| 运算符:在 c++ 中,仅当左侧“不足以”获得结果时才评估右侧操作数:如果 ||(或)的左侧为真,则结果将无论如何都是正确的,并且根据设计,正确的部分没有被评估
  • 考虑一个知道发生了什么的人的观点,你可能想回答你的问题。此人可能会查看您的代码并发现显然输出应该是1,无需解释。这使我们陷入了非生产性的僵局。你说输出不应该是1,而另一个人说应该。没有生产力。如果其中一个人解释了评估,那将会有所帮助。我建议你担任这个角色,为任何回答的人树立一个好榜样。您期望输出是什么,为什么?

标签: c++ if-statement logical-operators


【解决方案1】:

(a = a-3 && --a) 将使得 a = -1,因为 a-3 = -1。

您错过了此处的操作顺序,其中 &amp;&amp; 在分配之前进行评估。 (赋值几乎是最后评估的东西,当它在条件之外使用时才有意义。)a-3 确实是 -1,但该值没有分配给 a。相反,这是&amp;&amp; 的左侧,它的计算结果为true,因为它是在布尔上下文中使用的。接下来评估&amp;&amp; 的右侧,将a 减少为1 并评估为1。与左侧一样,它被转换为布尔值 (true),导致表达式 a-3 &amp;&amp; --a 的计算结果为 true

所以你的分配归结为a = truetrue 转换为1,因为aint

左边的值是什么?

我猜你是指&amp;&amp; 的左侧?该表达式 (a-3) 的计算结果为 true 作为布尔值。

如果编译器确实转到 OR [...] 的右侧

它没有,因为|| 短路布尔值。 (不过,用户定义的operator|| 不会短路。)左侧的计算结果为1(分配给a 的值),它在布尔上下文中转换为true。当|| 的左侧计算为true 时,不计算右侧。

此代码 1 的输出如何?

这是当您将 true 分配给 a 时转换为的。

幕后发生了什么?

(a =  a-3 &&  --a ) || a--
(a =  2-3 &&  --a ) || a--
(a =   -1 &&  --a ) || a--
(a = true &&  --a ) || a--
(a = true &&   1  ) || a--
(a = true && true ) || a--
(a =     true     ) || a--
(a =       1      ) || a--
(        1        ) || a--
(      true       ) || a--
           true

是不是只执行了 if 语句的一侧?

我不明白if 语句的“一面”是什么。可能您的意思是“条件”而不是“陈述”?无论如何,以上内容可能回答了您要问的问题。

要获得您似乎期待的结果,请添加括号以覆盖通常的operator precedence

if(( (a = a-3) && --a ) || a--)
//   ^       ^

【讨论】:

  • 感谢您的详细解释!写得很好。一步一步的演练消除了疑问。
【解决方案2】:

左侧条件不正确,结果为

(a = a-3 && --a ) --> 假

所以 --a 没有被调用

第二个陈述是正确的,因为 a 不为零

||一个--

so a-- 运行结果是 a=2-1=1;

还要记住你的条件语法是错误的 (a = a-3 && --a)

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多