C++を思い出す・・・#3
paiza.ioという実行結果を表示する恐らくC++11に対応していると思われる良いサービスを見つけたので実行結果が必要なものは今回からそれを使い貼り付けてみる事にした。
マニピュレータによる数値的な書式設定
取り敢えず動作が確認できるコードをざっと書いてみた。
hexで出力する事が以前少しあった気がしないでもないがunsetfとかはほぼ使った事がない。完全に忘れている。精度表示の桁が同じでも通常表示と科学表示では出力される桁が異なるんだったな。
式の評価順序
unsigned int i=1+1;
通常こういうような式をコンパイラが評価する時、どちらの1から評価されるのかは言語仕様としては特に定義されておらずコンパイラによるとのこと。コンパイラによって違うというのは知らなかった。ユーザーからすれば、それを不都合に感じる時が思いつかないぐらい、特にどちらでも良い事だが。
sizeofの評価
sizeof演算子のオペランドが評価されるのはオペランドが可変長配列型の場合のみなのでiはインクリメントされない。また10行目のprintfも可変長配列でないため評価されず、printfは実行されない。 11行目のprintfの戻り値(16)について気になったので規格書を読んでみたのだが「書き出された文字数」とのこと。だがその意味合いが良くわからない。ライブラリの内部バッファに書き込みした時点での文字数の事を言ってるのか、最終的に出力ストリームへフラッシュした文字数の事を指してるのか。。。 しかし結果から見るとこの16という数値は4*4という演算が伺える。要するにprintf関数の呼出しによって、書き出された文字数という事なのかな。そう考えるしかない。
14,15行目のコードは、C++の規格的に違反しているコードだが、コンパイラによっては、意味のない数値を返してしまったりする事があると見たので、試しに実行してみたのだがこのサービス上で動作させてみるとエラーを吐いた。その方が断然良いが。
特にGCCだと無意味な数値を返す、とあったので試しに私の環境で試してみたがしっかりとエラーを吐いてくれたので、取り敢えず安心。
$ gcc -v && cat test.cpp && g++ test.cpp Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1 Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) Target: x86_64-apple-darwin15.2.0 Thread model: posix #include<iostream> int main() { std::cout<<sizeof(main)<<std::endl; std::cout<<sizeof(void)<<std::endl; } test.cpp:5:19: error: invalid application of 'sizeof' to a function type std::cout<<sizeof(main)<<std::endl; ^~~~~~ test.cpp:6:13: error: invalid application of 'sizeof' to an incomplete type 'void' std::cout<<sizeof(void)<<std::endl; ^ ~~~~~~ 2 errors generated.
C++の仕様や規格を無視しまくる事で有名なVisual C++などでは有りうるのかもしれない。今環境が手元にないので確認しようがないが。