【问题标题】:Why does (0 && 1 == 0) not evaluate to true?为什么 (0 && 1 == 0) 不评估为真?
【发布时间】:2021-11-01 23:08:52
【问题描述】:

在我的if 语句中,&& 的第一个条件是0 (false),所以表达式0 && (a++) 等于0,对吧?那么0==0 应该是真的。为什么我在这里收到else?请解释!

int a=0;
if(0 && (a++)==0)
{
    printf("Inside if");
}
else
{
    printf("Else");
}
printf("%i",a);

【问题讨论】:

  • 首先,a++ 计算为 0,然后增加 a。但即使它评估为非零值,== 的绑定也比&& 更强(具有更高的优先级),因此您的表达式等效于0 && ((a++) == 0),无论(a++) == 0 评估为什么,这都是错误的。
  • == 的优先级高于&&。添加括号(0 && (a++))==0
  • 现在您已经有了答案,我建议您查看您的问题。你看到你的逻辑在哪里失败了吗? (一方面,这是一个有趣的问题,因为您的推论确实有效,但最终却不适用。)
  • if(0 && (a++)==0) 是糟糕的代码,应该无法通过任何代码审查。让你去查找优先表的代码是完全错误的。你最终将写出这样的代码,即使你认为你有完美的记忆力(提示:没有人 ...)。一个真正简单的经验法则:如果一行代码的作用不是很明显,那就是错误。

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


【解决方案1】:

== 运算符的优先级高于 && 运算符,所以这一行:

if(0 && (a++)==0)

被这样对待:

if(  0 && ((a++)==0) )

因此if 下的整个表达式为假,并且由于&& 运算符的短路,a++ 甚至没有被计算。

您可以在 cppreference.com 上阅读有关 Operator Precedence and Associativity 的信息。

如有疑问,应使用括号清楚地表达您的意图。在这种情况下,它应该是:

if( (0 && (a++)) == 0  )

不过,它没有任何意义,因为它总是计算为 true 并且 a++ 在这里也不会递增。

【讨论】:

  • 请注意,即使在修订版中,a++ 也永远不会执行。
【解决方案2】:

如前所述,== 的优先级高于&& 的优先级,因此该语句被解析为

if( 0 && ((a++)==0))

但是,即使添加正确的括号顺序,a++ 仍会返回 a 的原始值,即 0,但 a 会递增。如果你想返回a的更新值,你应该写++a

if( ((++a) && 0) == 0  )

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2013-09-02
    • 2011-07-04
    相关资源
    最近更新 更多