关系运算符==在C中是如何工作的?

关系运算符==在C中是如何工作的?,c,relational-operators,C,Relational Operators,我认为当要检查的语句为false时,关系运算符==返回0,当为true时返回1。然而,这并不是我在一段代码中得到的输出。谁能解释一下吗 我曾尝试在互联网上查找这一点,但无论在哪里,我都找到了与我所知道的相同的解释 int main() { int x=35; printf("\n%d %d %d",x==35,x=50,x>40); return 0; } 我希望输出是:1501 但结果显示:0 50 0 0在函数的参数中同时包含x==35和x=50的代码的行

我认为当要检查的语句为false时,关系运算符==返回0,当为true时返回1。然而,这并不是我在一段代码中得到的输出。谁能解释一下吗

我曾尝试在互联网上查找这一点,但无论在哪里,我都找到了与我所知道的相同的解释

int main()
{
    int x=35;

    printf("\n%d %d %d",x==35,x=50,x>40);

    return 0;
}
我希望输出是:1501
但结果显示:0 50 0 0

在函数的参数中同时包含
x==35
x=50
的代码的行为并不是由C标准定义的,因为它既修改
x
,又单独使用其值,而C的规则没有说明哪一个先发生。C 2018 6.5 2规定:

如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值计算的值未排序,则该行为未定义

x=50
中,主值为50,副作用是将
x
中存储的值更改为50

x==35
中,表达式是使用
x
值的值计算

一般来说,子表达式的计算是不排序的,因为C 2018 6.5 3规定:

除非稍后指定,否则子表达式的副作用和值计算是不排序的


C 2018 6.5.2.2规定了函数调用的情况,但未规定参数的求值顺序。因此,上文引用的6.5.3适用
x=50和
x==35不排序。因此,对
x
x
的未排序值计算都有副作用,因此6.52适用,并且行为不由C标准定义。

在函数的参数中同时具有
x==35
x=50
的代码行为不由C标准定义,因为它既修改
x
,又单独使用它的值,而C的规则并没有说明哪个先发生。C 2018 6.5 2规定:

如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值计算的值未排序,则该行为未定义

x=50
中,主值为50,副作用是将
x
中存储的值更改为50

x==35
中,表达式是使用
x
值的值计算

一般来说,子表达式的计算是不排序的,因为C 2018 6.5 3规定:

除非稍后指定,否则子表达式的副作用和值计算是不排序的

C 2018 6.5.2.2规定了函数调用的情况,但未规定参数的求值顺序。因此,上文引用的6.5.3适用
x=50和
x==35不排序。因此,对
x
x
的值计算都有一个副作用,是不排序的,因此6.5 2适用,并且行为不由C标准定义。

声明:

printf("\n%d %d %d",x==35,x=50,x>40);
修改
x
,以便(在这种情况下)当执行测试
x==35
时,
x
等于50

函数参数的求值顺序未定义,因此在其他情况下,结果可能不同。应该避免这样的代码。考虑:

printf( "\n%d", x == 35 ) ;
printf( "%d", x = 50 ) ;
printf( "%d", x > 40 ) ;
这是很好的定义,将产生您预期的结果

请注意,该语言将零和非零定义为分别表示false和true,而不是专门定义为零和一

声明:

printf("\n%d %d %d",x==35,x=50,x>40);
修改
x
,以便(在这种情况下)当执行测试
x==35
时,
x
等于50

函数参数的求值顺序未定义,因此在其他情况下,结果可能不同。应该避免这样的代码。考虑:

printf( "\n%d", x == 35 ) ;
printf( "%d", x = 50 ) ;
printf( "%d", x > 40 ) ;
这是很好的定义,将产生您预期的结果


请注意,该语言将零和非零定义为分别表示false和true,而不是专门定义为零和一

您所期望的是未指定的行为。printf执行操作的顺序不标准。可能与Do not vote重复以关闭此操作。这不是一个重复,也不是一个简单的图形错误。你所期望的是未指定的行为。printf执行操作的顺序不标准。可能与Do not vote重复以关闭此操作。这不是一个骗局,也不是一个简单的图形错误。谢谢你的回答。但问题是,这是在一本标准的C语言手册中给出的,并且没有提到这种代码是不排序的。再次感谢你的帮助。@MayukhBanerjee:这本书错了。关于C的这一事实是众所周知的。@MayukhBanerjee修复书籍比修复Q/AThanks更难找到答案。但问题是,这是在一本标准的C语言手册中给出的,并且没有提到这种代码是不排序的。再次感谢你的帮助。@MayukhBanerjee:这本书错了。关于C的这个事实是众所周知的。@MayukhBanerjee修复书籍比修复Q/A更难