【问题标题】:How is if statement evaluated in c++?在 C++ 中如何评估 if 语句?
【发布时间】:2010-12-01 12:50:18
【问题描述】:

if ( c ) 是否与 C++ 中的 if ( c == 0 ) 相同?

【问题讨论】:

  • 请记住,0 并不总是意味着同一件事。它可以是空指针常量或整数零。
  • 你的意思不是“if (c) 和 if (c!= 0) 在 C++ 中的意思一样吗?” ?
  • 变量c是否属于特定类型?
  • 只是诠释。但是如果 c 是指针会发生什么? 'if (c)' 检查 c 是否指向某个东西?
  • @derrdji,它与 0 进行比较,0 是 int 类型的零值。根据c的类型,会发生不同的事情。如果 c 是类的对象,则可以调用其重载的 operator==。如果 c 是双精度数,则整数将转换为双精度数。如果 c 是指针,则整数将被转换为空指针,并且与空指针的比较将检查 c 是否指向其类型的有效对象(或函数)。请注意,在所有情况下,0 始终相同并且始终表示相同。它只是可以转换成许多不同的东西。

标签: c++ if-statement evaluation


【解决方案1】:

不,if (c)if (c != 0) 相同。 而if (!c)if (c == 0) 是一样的。

【讨论】:

  • 假设没有发生奇怪的重载,这通常是 C++ 答案的一部分。
  • 当然,如果运算符 == 或 != 过载,任何事情都可能发生,它甚至可以开始为你播放国歌... ;-)
  • 这些天我要创建一个类,它重载运算符来播放声音效果。每次有人想要对它们进行排序时都会很棒。
【解决方案2】:

我会从这个包中脱颖而出......“if (c)”最接近“if (((bool)c) == true)”。对于整数类型,这意味着“if (c != 0)”。正如其他人所指出的那样,重载 operator != 可能会导致一些奇怪,但重载 "operator bool()" 也可能会导致异常,除非我弄错了。

【讨论】:

  • 这个问题最初只用 C 标记,因此上面的答案是因为 C 中没有 bool。
  • if(static_cast(c)) ... 我去拿我的外套。
  • if(bool cond = c) ...; 表示转换是隐式的。
【解决方案3】:

如果 c 是指针或数值,

if( c )

等价于

if( c != 0 )

如果 c 是布尔值(类型 bool [仅限 C++]), (编辑:或具有运算符 bool() 重载的用户定义类型)

if( c )

等价于

if( c == true )

如果 c 既不是指针也不是数值,也不是布尔值,

if( c )

不会编译。

【讨论】:

  • 它 c 是一种用户定义的类型,可以像 D. Shawley 和 galets 所指出的那样实现 operator bool(),因此它可以编译得很好。
  • 没错,我在说明中加了
【解决方案4】:

更像是if ( c != 0 )

当然,!= 运算符可以重载,因此说它们完全相等并不完全准确。

【讨论】:

    【解决方案5】:

    这仅适用于数值。如果 c 是类,则必须有一个重载的运算符进行布尔转换,例如这里:

    #include <stdio.h>
    
    class c_type
    {
    public:
        operator bool()
        {
            return true;
        }
    };
    
    int main()
    {
        c_type c;
        if (c) printf("true");
        if (!c) printf ("false");
    }
    

    【讨论】:

      【解决方案6】:

      是的,如果您将 == 0 更改为 != 0,它们是相同的。

      【讨论】:

      • if 语句被 定义 接受任何非零为真。所以是的,它是一样的。
      【解决方案7】:

      如果c 是一个指针,那么测试

      if ( c )
      

      不完全一样

      if ( c != 0 )
      

      后者是对c0(空)指针的直接检查,而前者实际上是检查c 是否指向有效对象的指令。但通常编译器会生成相同的代码。

      【讨论】:

      • 不,这不是......在指针的情况下两者的含义完全相同:if( c != NULL )
      • 编译和/或运行时无法知道对象在 C 或 C++ 中是否有效。你可以写成: " X* c = (X*)1; " 那么 c 几乎可以肯定指向一个无效的对象。并且“ if(c) ”将是真的。
      • @Andrew:我怀疑你能否证明你的说法是正确的,即无法检查对象是否有效。当然,编译器需要付出很多努力来生成运行时代码来检查,这就是为什么编译器不会打扰并生成相同的代码,即针对空指针进行测试。这就是为什么您的示例无法在(可能)所有当前编译器上产生错误结果的原因。
      • @Massa:恐怕不会。我的参考资料是 Bjarne Stroustrup(C++ 的创建者)的“The C++ Programming Language, Special Edition”中的第 6.3.2 节(选择语句)。你的是什么?
      • 比较一个对象指针和一个空指针确实会检查它是否指向一个有效的对象,而“有效对象”是指“具有非空指针地址的对象”
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2011-12-22
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多