【问题标题】:How does the relational operator == work in C? [closed]关系运算符 == 在 C 中如何工作? [关闭]
【发布时间】:2019-10-06 06:39:56
【问题描述】:

我认为当要检查的语句为假时,关系运算符 == 返回 0,当它为真时返回 1。但是,这不是我在一段代码中得到的输出。谁能解释一下?

我已尝试在互联网上查找此内容,但在任何地方我都找到了我所知道的相同解释。

int main()
{
    int x=35;

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

    return 0;
}

我预计输出为:1 50 1 但是显示的输出是:0 50 0

【问题讨论】:

标签: c relational-operators


【解决方案1】:

函数参数中同时包含x == 35x = 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 = 50x == 35 未排序。因此,xx 的值计算都存在副作用,它们是未排序的,因此适用 6.5 2,并且行为未由 C 标准定义。

【讨论】:

  • 感谢您的回答。但问题是这是在 C 的标准手册中给出的,并且没有提到这种代码是无序的。再次感谢您的帮助。
  • @MayukhBanerjee:这本书是错的。关于 C 的这一事实众所周知。
  • @MayukhBanerjee 修复书籍比 SO Q/A 更难
【解决方案2】:

声明:

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 ) ;

定义明确,会产生您预期的结果。

请注意,该语言将零和非零定义为分别表示假和真,而不是具体地表示零和一。

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2011-03-26
    • 2021-05-22
    • 2018-05-30
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多