C是否总是评估与&;有关的所有语句&;或||

C是否总是评估与&;有关的所有语句&;或||,c,evaluation,C,Evaluation,我这里有一个非常简单的问题,但我找不到答案: 假设我有一个由几个条件组成的条件从句。比如说 if((a == b && strcmp(string1, string)) || x <= 5) 在本例中,如果a==5,则不需要进一步检查,因为big语句的结果为TRUE,因此我们可以继续。这意味着不会对someFun()求值 是这样吗?我知道Java在这方面对&&和&resp.||产生了影响和|(后者在C中无论如何都不可用),但我不知道C如何处理这些运算符在C(和C++)

我这里有一个非常简单的问题,但我找不到答案:

假设我有一个由几个条件组成的条件从句。比如说

  if((a == b && strcmp(string1, string)) || x <= 5)
在本例中,如果a==5,则不需要进一步检查,因为big语句的结果为TRUE,因此我们可以继续。这意味着不会对someFun()求值


是这样吗?我知道Java在这方面对&&和&resp.||产生了影响和|(后者在C中无论如何都不可用),但我不知道C如何处理这些运算符在C(和C++)中。

C在知道答案之前进行计算,因此:

evalstorue()和&EvalsToAnything()同时计算这两个参数

evalstoalse()和&EvalsToAnything()只计算第一个

evalstorue()| | EvalsToAnything()只计算第一个


evalstovalse()| | EvalsToAnything()同时计算这两个值

始终计算左侧表达式。右侧表达式的计算如下所示:

  • a | | b
    --
    b
    仅当
    a
    的计算结果为
    false
  • a和&b
    --
    b
    仅当
    a
    的计算结果为
    true
&&
的优先级高于
|
,因此

  • a | | b&c
    --
    b&c
    仅当
    a
    计算结果为
    false
  • a&b|c
    --
    c
    仅当
    a&b
    计算结果为
    false
  • (a | | b)和&c
    --
    c
    只有在
    a | | b
    计算结果为
    true时才会进行计算
  • a&&(b|c)
    --
    b|c
    仅当
    a
    计算结果为
    true
  • a&&b&&c
    --
    c
    仅当
    a&&b
    计算为
    true
  • a|b|c
    --
    c
    仅当
    a|b
    计算为
    false

评估从最左边开始。。当整体条件不再有效时退出

短路评估。。。这是我一直在寻找的术语,但就是记不住了:)
&
都有C语言版本。
  if(a == 5 || b > 12 || (c = someFun()) == 3)