7

私はたまたまこのコードに出くわしました。

int x(int a){
    std::cout<<a<<std::endl;
    return a + 1;
}

int main()
{
    std::cout<<sizeof(x(20))<<std::endl;
    return 0;
}

私はそれが4に続いて20を印刷することを期待しました。しかしそれは4を印刷するだけです。なぜそうなるのですか?副作用(IO /ファイルへの出力など)がある関数を最適化するのは正しくありませんか?

4

5 に答える 5

15

sizeofはコンパイル時の演算子であり、オペランドが評価されることはありません。

于 2012-04-26T06:56:11.900 に答える
4

sizeofは実際には演算子であり、コンパイル時に評価されます。

の戻り型のサイズxが固定されているため、コンパイラはそれを評価できます。プログラムの実行中に変更することはできません。

于 2012-04-26T06:56:02.233 に答える
2

sizeofの結果は、C++でのコンパイル時に計算されます。したがって、x(20)への関数呼び出しがあります

于 2012-04-26T06:56:15.603 に答える
2

sizeof()データ型のサイズを示します。あなたの場合、データ型を取得するために関数を呼び出す必要はありません。

sizeofも、実行時ではなくコンパイル時にビジネスを行うのではないかと思います...

于 2012-04-26T06:59:35.337 に答える
2

c ++ 03標準、#5.3.3を引用させてください。

sizeof演算子は、そのオペランドのオブジェクト表現のバイト数を生成します。オペランドは、 評価されない式、または括弧で囲まれたタイプIDのいずれかです。

于 2012-04-26T07:00:24.200 に答える