4

戻り値の型の暗黙的な型変換が原因である、プログラムのバグを最終的に見つけました。これ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;
}
4

3 に答える 3

3

これは正しいコードです。if (i) where ihas typeintも正しいです。

n3376 4.12/1

算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。

于 2013-02-28T12:13:33.160 に答える
1

通常タイプのプロモーションです。C++ 標準から:

boolcharwchar_t、および符号付き整数型と符号なし整数型をまとめて整数型と呼びます。

と:

type の右辺値は type の右辺値boolに変換でき、 int0falsetrueなるか 1 になります。

于 2013-02-28T12:17:01.023 に答える
0

実際、ほとんどの (すべての?) コンパイラは、通常、有効桁数または精度が失われる可能性について警告するとき (たとえば、int から char への変換など) は概念的に矛盾しているように見えますが、bool への変換については例外を設けています。

それには歴史的な理由しかないと思います。

多くのレガシー コードでは、次のような構造が使用されています。

if(数値)... または if(ポインタ) ...

それ以外の

if(number!=0)... または if(pointer!=NULL) ...

さらに、後者のスタイルはしばしば冗長すぎると見なされます。

伝統は便利で、簡潔なコードを書くことができますが、実際にはエラーが発生しやすくなっています。一部の別の言語 (Java など) では (意識的に) サポートされていません。

于 2013-02-28T13:26:25.573 に答える