【问题标题】:What is the point of == true in conditionals?== true 在条件句中有什么意义?
【发布时间】:2013-12-25 13:43:12
【问题描述】:

我正在学习 C++ 和 java,我注意到如果你有条件,那么如果条件为真,后面的任何代码都将被执行,即使你没有明确写 == true

考虑以下非常简单的 C++ 代码:

bool c_plus_plus_is_cool(){
    return true;
}

int main(){
    if (c_plus_plus_is_cool()) {
        cout << "C++ is cool!";
    } 
    return 0;
}

问:有什么区别

if (c_plus_plus_is_cool())if (c_plus_plus_is_cool() == true)

在其他语言中也是如此吗(比如 Java(我一直在写 ==true...))?

【问题讨论】:

  • 尽管问题不在于这个,但 C++ 有一个非常有趣的“布尔上下文”(通常是“上下文转换”)概念,它允许使用各种很好的方式来编写 if 语句.
  • 没有意义,相信这是一个自我防卫的习惯,因为许多 C 新手一直忘记 if (0) 做了什么......
  • 这个问题的答案在 C++ 和 Java 中非常不同。尤其是如果您考虑到常见警告以及c_PLUS_PLUS_IS_cool() 返回除bool 之外的其他内容的可能性,这在if 所在的位置远非显而易见。

标签: java c++ conditional


【解决方案1】:

== 运算符返回一个布尔值。
如果您已经有一个布尔值,== true 将与原始布尔值没有什么不同;写出来没有意义。

同样,使用! 运算符代替== false

对此的一个例外是 C# 可为空的布尔值,其中 == true 对于 null 将为 false。

【讨论】:

  • ! 而不是== false”?真男人用!(c != false) != true
  • @KerrekSB:请注意,== true!= true== false!= false== null== null!= null 这六个操作对于可为空的布尔值都是有效且不同的。
  • @KerrekSB:真正的男人使用:!(c != (4==5)) != (4!=5) ;-)
  • 问题标签中没有“C#”,唉。在 C++ 中,如果 std::optional&lt;bool&gt; 存在的话,它也会带来一些乐趣。
【解决方案2】:

C++ 和 Java 在这一点上具有相同的行为,在这两种语言中,== true 只是多余的噪音。

到目前为止,如果您在 Java 中使用冗长的语法,那么这是您自己的私人风格。即使在 Java 中,这也不是常用和接受/推荐的样式。

【讨论】:

    【解决方案3】:

    其实除了== true带来的语法膨胀之外没有什么区别。

    【讨论】:

      【解决方案4】:

      在 C/C++ 和几乎所有语言中,ifwhile 封装了仅在 condition 满足时才会执行的代码块真的。在条件语句中显式添加 == true 是多余的,但有些程序员更喜欢这样做;它基本上是一种样式选择,不会影响程序的行为或速度。

      【讨论】:

        【解决方案5】:

        他们都是一样的。该语言实现条件如下:

        遇到if语句时,请检查条件是否为真。 现在,当我们这么说时,它显然允许您这样做 == , 编译器/解释器会说是数据类型还是值 平等的?如果是,则继续进行。

        请参考flowchart

        这段代码:

        bool c_plus_plus_is_cool(){
            return true;
        }
        
        int main(){
            if (c_plus_plus_is_cool()) {
                cout << "C++ is cool!";
            } 
            return 0;
        }
        

        等同于:

        int main(){
            if (c_plus_plus_is_cool() == true) {
                cout << "C++ is cool!";
            } 
            return 0;
        }
        

        【讨论】:

          【解决方案6】:

          == trueifwhile(或类似for 或三元运算符之类的东西)中没有区别,特别是如果左值已经是bool 类型,在你的情况下是.

          如果您需要将值显式转换为 bool,则纯显式转换 (bool(expr)) 看起来要好得多。

          这种奇怪的比较是合理的唯一情况是== 左侧的值属于具有将bool 作为第二个参数的比较运算符的类(尽管这通常意味着糟糕的设计:)) .但事实并非如此,所以在我看来,这样的编码约定绝对没有用,而且相当丑陋。

          【讨论】:

            【解决方案7】:

            第二个是一个坏习惯,在其他情况下会给出错误的答案:

            int f() {
                return 3;
            }
            
            if (f() == true)
                std::cout << "Won't get here\n";
            if (f())
                std::cout << "Will get here\n";
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-04-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-26
              • 1970-01-01
              • 2022-01-23
              相关资源
              最近更新 更多