【问题标题】:Logical Operators and their precedence in C/C++逻辑运算符及其在 C/C++ 中的优先级
【发布时间】:2012-10-30 14:31:00
【问题描述】:

我最近遇到了一段代码

// 克服被零除的程序

int a=0;
int b=100;

int c= a==0 || b/a ;

printf("Hello");

//输出:你好

我的理论: 根据优先级,运算符 / 的优先级高于 ||。所以 b/a 必须首先执行,我们应该得到一个运行时错误。

我假设正在发生的事情是:

短路运算符 || , 计算 LHS a==0,结果为真,因此不执行 b/a。

我的理论错了吗?我很确定这是非常简单的事情,我现在无法弄清楚

【问题讨论】:

  • 请告诉我为什么要写代码,你必须挠头才能弄清楚发生了什么?它很愚蠢,无法维护,因此是 c**P!请告诉我写这样的代码有什么意义。
  • @EdHeal 实际上这很常见。唯一困扰我的是 (a==0) 在分配给 c 时被视为 int 0 而不是 boolean false,但我相信无论如何这是 C 的事情。
  • @EdHeal 我还没有写这段代码,我在我正在执行的某个程序中看到了这段代码。
  • @GolezTrol a == 0 计算结果为 1/true。存在从boolint 的隐式转换,因此int c = boolean_expression; 等价于int c = boolean_expression ? 1 : 0;
  • @DanielFischer,谢谢- 大团结球迷:)。

标签: c++ c operators logical-operators


【解决方案1】:

优先级并不意味着评估顺序,只是分组(括号)。

|| 的第一个操作数的求值之后有一个序列点(旧说法),因此|| 的第一个操作数必须在第二个操作数之前求值,无论这些操作数是什么。由于在这种情况下,表达式 a == 0 || b/a 的整体结果由第一个操作数确定,因此根本不计算第二个操作数。

【讨论】:

  • +1。这称为Short-circuit evaluation
  • 非常棒的信息,感谢@GolezTrol 和 Daniel Fischer。我假设这是我缺少的一些简单的语法问题。
  • 老师在解释运算符优先级时说的肯定有根本性的错误,因为很多人出来认为它与评估顺序有关。也许需要某种组织,在世界各地寻找那些说“首先评估最高优先级操作员”(或任何基本错误)的人,将他们捆绑成货车并将他们开往秘密基地进行再教育。
【解决方案2】:

/ 的优先级高于 || 意味着表达式被计算为:

int c= (a==0) || (b/a) ;

不是

int c= (a==0 || b)/a ;

但是,由于逻辑评估是短路的,b/a 将仅在 a!=0 时被评估。

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多