代码之家  ›  专栏  ›  技术社区  ›  jwfearn

是在C++中转换为BoL的一种安全方法

  •  50
  • jwfearn  · 技术社区  · 16 年前

    [这个问题与……有关,但与……不同 this one .]

    如果我试图使用某些类型的值作为布尔表达式,我会得到一个警告。我有时使用三元运算符,而不是抑制警告( ?: !! )似乎做了同样的事情。

    我的意思是:

    typedef long T;       // similar warning with void * or double
    T t = 0;
    bool b = t;           // performance warning: forcing 'long' value to 'bool'
    b = t ? true : false; // ok
    b = !!t;              // any different?
    

    void * double T )?

    !!t 这是很好的风格。我在问它在语义上是否与 t ? true : false .

    17 回复  |  直到 7 年前
        1
  •  84
  •   fizzer    16 年前

    b = (t != 0);
    

    没有隐式转换。

        2
  •  42
  •   Dima    16 年前

    或者,您可以执行以下操作: bool b = (t != 0)

        3
  •  32
  •   edgar.holleis    16 年前

    • 布尔值是关于真与假的。

    这些是非常不同的概念:

    • 真理与谬误是决定事物的关键。
    • 数字是关于数东西的。

    在衔接这些概念时,应该明确地做到这一点。我最喜欢迪玛的版本:

    b = (t != 0);

    该代码清楚地说明:比较两个数字,并将真值存储在布尔值中。

        4
  •  6
  •   Mike F Mike F    16 年前

    所有有效的技术都将生成相同的代码。

    就个人而言,我只是禁用了警告,以便使用最干净的语法。我并不担心我会意外地把演员演成一个傻瓜。

        5
  •  6
  •   EvilTeach    16 年前


    是的,它是安全的。


    0被解释为false,其他一切都是true,

    !0是真的
    所以结果证明5是真的

        6
  •  6
  •   m13r    8 年前

    bool b = !!t;
    

    这是可读性最低的方式(因此最难维护)

    其他的取决于情况。
    如果要转换为仅在布尔表达式中使用。

    bool b = t ? true : false;
    if (b)
    {
        doSomething();
    }
    

    然后我会让语言为你做这件事:

    if (t)
    {
        doSomething();
    }
    

    bool  b = t ? true : false;      // Short and too the point.
                                     // But not everybody groks this especially beginners.
    bool  b = (t != 0);              // Gives the exact meaning of what you want to do.
    bool  b = static_cast<bool>(t);  // Implies that t has no semantic meaning
                                     // except as a bool in this context.
    

    总结:
    试着把你正在做的事情说清楚

        7
  •  3
  •   tabdamage    16 年前

    计算结果为true的表达式与该值的布尔值之间存在差异。

    Dima的方法也很好,因为它将表达式的值赋给bool。

        8
  •  2
  •   warren    16 年前

    如果您担心警告,也可以强制演员: bool b = (bool)t;

        9
  •  2
  •   Jim In Texas    16 年前

    我真的很讨厌!!T这是关于C和C++最糟糕的东西,是用你的语法太聪明的诱惑。

    布尔b(t!=0);//这是最好的方式,它清楚地显示了正在发生的事情。

        10
  •  2
  •   Jay K    6 年前

    与0的比较效果不太好。

    class foo { public: explicit operator bool () ; };
    
    foo f;
    
    auto a = f != 0; // invalid operands to binary expression ('foo' and 'int')
    auto b = f ? true : false; // ok
    auto c = !!f; // ok
    
        11
  •  1
  •   Kristopher Johnson    16 年前

        12
  •  0
  •   alex alex    16 年前

    我会使用b=(0!=t)——至少任何一个理智的人都能轻松地阅读它。如果我在代码中看到双重危险,我会非常惊讶。

        13
  •  0
  •   Jay Bazuzi Buck Hodges    16 年前

    禁用警告。

    先写清楚;然后是剖面图;然后根据需要优化速度。

        14
  •  0
  •   aib    16 年前

    !! 仅在以算术方式使用布尔表达式时有用,例如:

    c = 3 + !!extra; //3 or 4
    

    bool b = !!extra;
    

    与以下内容一样有意义:

    if (!!extra) { ... }
    
        15
  •  -1
  •   Marco M.    16 年前

    我建议使用

    如果(x!=0)

    代替if(x);它更容易理解和阅读。

        16
  •  -2
  •   plinth    16 年前

    这对我来说并不好笑,调试代码中的双精度测试将与优化代码中的双精度测试非常不同。

    如果你爱上了!!你可以随时宏它。

    #define LONGTOBOOL(x) (!!(x))
    

    (顺便说一句,在这些情况下,我喜欢三元运算符)

        17
  •  -4
  •   Paul Nathan    16 年前

    我将使用bool b=t并保留compile警告,评论这一行的安全性。禁用警告可能会在代码的另一部分对您造成不利影响。