任何人都可以解释“ if”语句如何在此处执行

时间:2018-08-10 11:22:38

标签: c

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

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

6 个答案:

答案 0 :(得分:18)

order of operations与您的想法不同。

您的表情等同于

x && (y==1)

在您的情况下为false

答案 1 :(得分:3)

尝试一下。

由于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");
}

答案 2 :(得分:2)

尽量不要过多考虑评估顺序。它经常会使您感到困惑。需要关注的更重要的事情是如何将运算符分组在一起以及表示表示什么。

&&运算符的优先级相对较低。几乎在您每次使用它时,它都会具有以下形式

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。 ,然后使用&&来确定它们是否都成立。在&&的情况下,我们还知道它将在{em>之前决定x是否为真。{em} y&&运算符的一个相当特殊的属性,不是不适用于大多数其他更普通的运算符,例如||和{{1 }}。

答案 3 :(得分:0)

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

它不会评估您的想法。它先评估x,然后再评估y == 1,然后再评估&&,在您的情况下,该评估在1 && 0中得到false

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

这里

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 {
}