FreeBSD の LLVM で C 言語とC++ の小数型リテラル値の論理和を試す2018年10月03日 12時06分32秒

FreeBSD の LLVM で C 言語の整数型リテラル値の論理和を試したのは今回への布石。「&&」の論理和は基本的に整数値を取るはずなのだが、浮動小数点などを渡した場合に、エラーになるのか、警告が出るだけで済むのかを試したかった。論理和などは整数型に型変換出来るだろうが、シフトなどに小数型を渡された時の動作を見たいのだ。

そこで、まずは FreeBSD 11.2-RELEASE 上の LLVM で実験。

freebsd% cat logical-and-double.c
int main()
{   
    return 1 && .2;
}
freebsd% cc logical-and-double.c
logical-and-double.c:3:17: warning: implicit conversion from 'double' to '_Bool'
      changes value from 0.2 to true [-Wliteral-conversion]
    return 1 && .2;
             ~~ ^~
1 warning generated.
LLVM は double 型を _Bool 型に変換すると警告。_Bool 型ときて気になったのが C++。興味深いのは整数型リテラル値の論理和を試した時は、「warning: use of logical '&&' with constant operand]と警告されたのに、浮動小数点型の定数を渡すと、[-Wconstant-logical-operand] は警告されない。

C++ では bool 型に変換されるのだろうか。

freebsd% cat logical-and-double.cpp
int main()
{   
    return 1 && .2;
}
freebsd % c++ logical-and-double.cpp
logical-and-double.cpp:3:17: warning: implicit conversion from 'double' to
      'bool' changes value from 0.2 to true [-Wliteral-conversion]
    return 1 && .2;
             ~~ ^~
1 warning generated.
との事で、bool 型に変換された。

おまけで、c ファイルを c++ でコンパイルした時の結果。

freebsd% c++ logical-and-double.c
c++: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
logical-and-double.c:3:17: warning: implicit conversion from 'double' to 'bool'
      changes value from 0.2 to true [-Wliteral-conversion]
    return 1 && .2;
             ~~ ^~
1 warning generated.
c ファイルを c++ としてコンパイルしていると警告を出している。.2 が bool 型に変換されているのも証拠。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2018/10/03/8968211/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。