【问题标题】:!= symbol query in C language!= C 语言中的符号查询
【发布时间】:2012-06-07 20:34:58
【问题描述】:
int x = 15 ;
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;

代码的输出是 1 20 1 但我认为它应该是 0 20 1 因为 15 == 15...

我遇到了“x != 15”部分的问题

【问题讨论】:

  • 应该是 x==20 而不是 x=20。这会导致您的 x 变量从 15 更改,并且实际上使该答案有意义。
  • printf 的第三个参数是 x = 20,它将 x 分配给 20。C 不保证评估参数的顺序,因此可以在 @ 之前评估 x = 20 987654326@.

标签: c operators


【解决方案1】:

您正在使用 x = 20 为 x 分配一个新值。

您不能对函数调用的参数列表中的这些操作假定任何特定顺序。

【讨论】:

  • 我认为他根本不是故意的。看起来他对输出中的 20 并不感到惊讶。我认为他只是对 x != 15 在分配后进行评估感到惊讶。
  • @sepp2k 就是这样,我更仔细地阅读了问题和预期的输出并编辑了我的答案。谢谢。
【解决方案2】:

根据我的经验,在大多数 C/C++ 编译器下,大多数参数列表都是从右到左处理的,即使规范没有说明要求的评估顺序。

了解许多编译器的工作原理后,您的参数列表将像这样评估

printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;

按(可能)的顺序评估

x < 30  => 1
x = 20 (assigns x to 20, returning 20) => 20
x != 15 => 1 (because x is now 20)

如果此评估顺序适用于您的编译器,则像这样重新排列参数

printf ( "\n%d \t %d \t %d", x < 30, x = 20, x != 15 ) ;

应该让步

1 20 0

因为比较 x != 15 将在 x 重新分配为 20 之前发生。

这个练习的教训是通常避免在列表结构中赋值(看起来像“a、b、c、d”的东西)或至少不要在同一个列表中读取赋值变量构造,因为你不能保证从右到左或从左到右评估(它取决于编译器)。

【讨论】:

  • 坦率地说,行为是未定义,结果因编译器而异。
  • @JohnBode 我想我已经说得很清楚了,但是大多数使用 LR 类型解析器实现的编译器会导致高效(因此被选中)从右到左的列表处理。如果不清楚评估顺序无法确定,感谢您使其更加明确。
【解决方案3】:

您的代码存在未指定的行为:标准并未规定执行表达式的顺序是从左到右。 试试这个

int x = 15 ;
int result1 = (x != 15);
int result2 = (x = 20);
int result3 = (x < 30);
printf ( "\n%d \t %d \t %d", result1, result2, result3 ) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多