C ++字符串(const char [1])到bool类型转换 - 原因/解释和后果

时间:2016-07-15 10:40:24

标签: c++ casting type-conversion

看一下以下C ++代码:

// imagine 10.000 lines if C++ here

bool test() {
   // imagine 300 loc here 
   return "";
}

int main(int argc, char** argv) {
    bool whaaaaaat = test();
    return 0;
}

编译这些行时,结果为:

BUILD SUCCESSFUL (total time: 208ms)

甚至没有警告!

请确认:

  1. “”被C ++编译器视为char [1] aka char *
  2. 然后转换为bool
  3. 总是!= 0 =>永远是真的
  4. 问题: 当程序继续时,是否会对程序状态产生负面影响(内存损坏?)。

    此设置非常危险,编译器至少应该发出警告!

5 个答案:

答案 0 :(得分:2)

你基本上是对的。

你的字符串文字char const[1]会衰减到char const*,和任何指针一样,booleanisation会告诉你它是否为空。这个不是。

我通常倾向于同意这种隐式转换很危险,但这只是因为你的程序行为可能不是你想要的那样。没有“破纪录”。

答案 1 :(得分:1)

  

""被C ++编译器视为char[1]又名char**

""被视为一个常量 char的数组。 not char*相同,但在某些情况下,它可以转换为const char*(const-ness特定于C ++)。

  

然后转换为bool!= 0 =>总是true

纠正两点。

  

当程序继续时,是否会对程序状态产生负面影响(内存损坏?)

这绝对没有任何后果:没有内存泄漏,没有悬空指针或其他坏事。

答案 2 :(得分:1)

它被明确定义为boolean conversions(隐式转换之一):

  

整数,浮点,无范围枚举的prvalue,指针,   和指向成员的类型可以转换为类型的prvalue   布尔。

     

零值(对于积分,浮点和未作用域)   枚举)和空指针和空指针到成员   价值变得虚假。所有其他值都成为现实。

对于您的代码,""可能会衰减为非空的指针(即const char*),因此结果将为true。对于指针,它只是检查它是否为空并返回bool truefalse,它会很好(没有"破碎的记忆" :))。

答案 3 :(得分:1)

没有负面影响,只是糟糕(太难以取消)编码风格。 我在多年的工作项目中看到了这样的代码

assert(somethingIsRight && "Something is wrong!");

答案 4 :(得分:1)

  

""被C ++编译器视为char [1]又名char *

非常不精确的说,是的。更确切地说,""const char[1],而const char数组可以衰减到const char*,它指向第一个(仅在这种情况下)字符。

  

然后转换为bool

     

总是!= 0 =>永远是真的

对两者都是肯定的。

  

问题:当程序继续时,是否会对程序状态产生负面影响(内存损坏?)。

没有破纪录,或任何其他负面影响。行为定义明确。这个功能实际上是一样的:

bool test() {
    "";
    return true;
}
  

此设置非常危险

我不同意。它最多毫无意义。

  

问题是关于一个函数返回总是正确的,没有编译器的任何警告或错误,这只是简洁的例子。

我认为这不是一个警告,而是一个错误。

考虑一个接口,它是对不同类型进程的抽象,在成功时返回true。现在考虑实现该接口,知道您的简单过程永远不会失败,因此总是返回true。编译器是否应该阻止您编写此类实现?它甚至会警告你吗?不在我看来。

  

您认为gdb可能会受到影响吗?

没有