我终于找到了程序中的一个错误,这个错误是由返回类型的隐式类型转换引起的。即使使用g++ -Wall
,也没有任何警告。
我想知道是否有某种方法可以快速找出这种无意识的错误?
#include <iostream>
// return type should be int, but I wrote bool by mistake
bool foo(int x) {
return x;
}
int main() {
for (int i = 0; i < 100; ++i) {
std::cout << foo(i) << std::endl;
// 0 1 1 1 1 1 ..
// should be 0 1 2 3 4 ...
}
return 0;
}
答案 0 :(得分:3)
这是正确的代码。如果(i)其中i
类型int
也是正确的。
n3376 4.12 / 1
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。
答案 1 :(得分:1)
这是正常的类型促销。 来自C ++标准:
bool
,char
,wchar_t
以及有符号和无符号整数类型是统一的 称为整数类型
和
类型
bool
的右值可以转换为类型的右值int
,false
变为零,true
成为一个。
答案 2 :(得分:0)
Iddeed,大多数(所有?)编译器在通常警告可能会丢失有效数字或精度时(例如在int转换为char或类似情况时)似乎在概念上不一致,但是转换为bool时会例外。
我认为只有历史原因。
许多遗留代码使用
之类的结构if(number)...或if(pointer)...
而不是
if(number!= 0)...或if(pointer!= NULL)...
此外,后一种风格通常被认为过于冗长。
传统很方便,允许编写简洁的代码,但确实容易出错。它(有意识地)不支持某些其他语言(例如Java)。