【问题标题】:Variable x equals a or b变量 x 等于 a 或 b
【发布时间】:2013-02-09 18:09:27
【问题描述】:

这是:

if(x == a || b){//do something}

同:

if(x == a || x == b){//do something}

?

我认为不是,因为在第一种情况下,我们评估 x 是否等于 a 以及 b 是真还是假。

在第二种情况下,我们评估 x 是否等于 a 以及 x 是否等于 b。我知道在lazy evaluation 中,如果 x 等于 a,我们不会进一步评估。

但有人认为,在第一种情况下,我们会问 x 是等于 a 还是 b,所以我想确定一下。

【问题讨论】:

  • "I think it is not" - 你是对的,你的推理也是。
  • 自己测试比提出问题更容易。
  • @Nile 一个测试告诉你一个实现是如何做到的。查阅标准(或 Stack Overflow)会告诉您每个实现应该如何表现。
  • 在第一次检查中需要一个人挠头的正确代码可能是一个好主意。
  • C 还是 C++?不要同时标记两者。

标签: c++ lazy-evaluation


【解决方案1】:

否。

在 C++ 中,这是:

x == a || b  // Same as (x == a) || b

相当于这个:

(x == a) || (bool)b

如果x 和a 相等,则计算结果为true,或者如果转换为bool 时b 计算结果为true。另一方面,在 C 中,它等价于:

(x == a) || (b != 0)

如果x 和a 相等或b 不等于0,则计算结果为true(这里我们必须隐含假设b 是整数类型,否则这不会编译)。

另一方面,这个:

(x == a || x == b) // Same as ((x == a) || (x == b))

当x 和a 相等或x 和b 相等时计算为true(即,如果x 等于a 或等于b)在 C++ 和 C 中。

【讨论】:

  • 嗯,不完全是,C 没有 bool 类型,我不认为 C++ 在这个结构中从 C 转移。当然 OP 标记为两者,所以它对所有人都有点免费。
  • @djechlin:是的,我错过了 C 标签。这个答案适用于 C++。我会编辑。
  • 我仍然不确定它是否正确?我不知道 C++ 是否 if(5) 表示 if((bool) 5) 或 if(true) 表示 if((int)true)。后者意义不大,但更符合 C。
  • @djechlin:在 C++ 中,if 中的条件转换为 bool。请参阅 C++11 标准的第 6.4/4 段:“在除 switch 语句之外的语句中作为初始化声明的条件的值是上下文转换为 bool 的声明变量的值(子句4). 如果该转换格式不正确,则程序格式错误。"
【解决方案2】:

这两个表达式不等价。这个

if(x == a || b)

相当于

if( (x == a) || (b))

即x==a 和b 的或。在 C++ 中,如果 b 的计算结果不是 0 或 false,则将其视为 true。

第二个测试是否x==b,而不是简单地测试b。

【讨论】:

    【解决方案3】:

    没有。在 C 中,这相当于:

    if(x == a || b != 0)
    

    【讨论】:

    • b 不一定与 0 可比。
    • 是否有b != 0 可以生成但b 不能生成的警告?
    • @djechlin 不,因为这真的是等价的。
    【解决方案4】:

    第一个读作“如果 x 等于 a,或者如果 b 为真”

    第二个读作“如果 x 等于 a,或者如果 x 等于 b”

    【讨论】:

      【解决方案5】:

      没有。

      if (x == a || b)
      

      等于

      if ((x == a) || (bool)b)
      

      因为运算符== 的优先级高于运算符||。见Operator Precedence Table。

      【讨论】:

        【解决方案6】:

        你几乎是对的,第一种情况意味着 x 等于 a 或 b 为真。

        惰性求值意味着仅在结果明显之前对表达式进行求值。在 OR 表达式中,例如(x || y),结果将在x==true 时知道——那么整个表达式也必须为真。在 AND 的情况下,如(x && y),当x==false 时结果将很明显。所以你是对的,如果x==a,我们已经知道答案,不需要更多的工作。

        【讨论】:

          猜你喜欢
          • 2010-12-08
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          • 1970-01-01
          • 2011-08-01
          • 2017-07-11
          • 2014-11-10
          • 1970-01-01
          相关资源
          最近更新 更多