【问题标题】:Could anybody explain how "if" statement executed here谁能解释一下“if”语句是如何在这里执行的
【发布时间】:2018-08-10 11:22:38
【问题描述】:

根据我有限的知识,逻辑运算符具有从左到右的评估顺序。根据该规则,它应该评估 x && y 这是 1 然后它应该在 if 语句中评估 == 1 。但那是没有发生的事情。谁能帮我解决这个问题。

int main()
{
    int x = 1, y = 2;
    if (x && y == 1)
        printf("true\n");
    else
        printf("false\n");
}

【问题讨论】:

标签: c


【解决方案1】:

order of operations 和你想的不一样。

你的表达相当于

x && (y==1)

在你的情况下是false

【讨论】:

  • 我应该如何决定将 () 括号放在哪里。就像在这个例子中一样 int z = x 5;
  • 这取决于你想做什么。您可以随时添加不需要的括号,但如有疑问,只需编写两个单独的语句。每个人都会更快乐(别人读你的代码,或者你在一年的时间里读你的代码)。
  • 我不是在写这些。这些是我在解决 c 语言测验时面临的问题。
  • 那么,您需要查看我链接到的页面上的表格。您点击的第一个运算符首先被评估。因此,将运算符表达式替换为其结果并再次遍历表。
  • 哦,终于明白了。这并不像我想象的那么简单。 @rubenvb 你帮了大忙,谢谢:)
【解决方案2】:

试试这个。

因为https://en.cppreference.com/w/c/language/operator_precedence

int main()
{
    int x = 1, y = 2;
    if ((x && y) == 1)
        printf("true\n");
else
    printf("false\n");
}

【讨论】:

    【解决方案3】:

    尽量不要过多考虑评估顺序。它常常会让你感到困惑。更重要的是要关注运算符如何组合在一起以及表达式的含义

    && 运算符的优先级相对较低。几乎任何时候你使用它,它都会有这种形式

    if( condition_1 && condition_b )
    

    并且解释很明显:“如果condition_a 为真并且 condition_b 为真”。

    在您的情况下,condition_a 只是 x,而 condition_by == 1。所以解释是“如果x 为真并且 y 等于1”。

    x 为真意味着什么?很简单,它不是零。所以我们可以进一步扩展:就像你写的一样

    if ( x != 0 && y == 1 )
    

    并且解释是“如果x 不等于0 并且 y 等于1”。

    请记住,优先级表示运算符如何组合在一起。在你的情况下,就好像你写了

    if ( x && ( y == 1 ) )
    

    == 1 部分与y 一起使用。 ==&& 绑定得更紧密。

    就“求值顺序”而言,您可以说,是的,编译器在使用之前会发出判断 x 是否为真的代码,以及判断 y 是否等于 1 的代码&& 来确定它们是否都是真的。在&& 的情况下,我们也知道它将决定x 是否为真它决定y 是否等于1。(但这是&&|| 运算符。它确实适用于大多数其他更普通的运算符,例如 +/。)

    【讨论】:

      【解决方案4】:

      因为y == 1 是假的y = 2,写在if 语句之前。

      它不会按照您的想法评估他们。它评估x,然后是y == 1,然后是&&,在你的情况下是1 && 0,你有false结果。

      【讨论】:

        【解决方案5】:

        这里

        if (x && y == 1)
        

        上面的语句等价于

        if(x && (y==1) ) /* y==1 performed first, which is false */
        

        正如你在这里看到的https://en.cppreference.com/w/cpp/language/operator_precedence

        您希望得到true 作为输出,然后首先通过保持() 执行x&&y

        if ( (x && y) == 1) { /* now () has higher precedence, so it perform x&&y first which results in true(1) and then 1==1 results in true */
        }
        else {
        }
        

        【讨论】:

          【解决方案6】:

          这是因为operator precedence
          由于运算符优先级,表达式if (x && y == 1) 的结果为if (x && (y == 1))
          所以,整个表达式的结果是false,因为y==1false

          使用括号并将其更改为if ((x && y) == 1) 以获得所需的结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-02
            • 1970-01-01
            相关资源
            最近更新 更多