3

簡単なコードを次に示します。

#include <iostream>
using namespace std;

bool func(char* m)
{
    *m = '4';
    return true;
}

using namespace std;
int main()
{
    char c1 = '3';
    cout  << "a" << c1 << func(&c1) << c1 << "b" << endl;

    return 0;
}

これを g++ -O0 (4.7.2) でコンパイルすると、出力は a413b になり、-O2 の場合、出力は a414b になります。clang++ 3.2 の場合、出力は a314b です。

コードのこの部分で、c++ に対して未定義のことをしましたか?

4

2 に答える 2

5

はい、func(&c1)と 2 つの評価の順序c1は指定されていません。

これは、3 つの式を任意の順序で評価できることを意味し、次のいずれかの出力が得られます。

a313b
a314b
a413b
a414b

関数パラメーターの評価順序を参照してください

于 2013-03-05T18:47:46.943 に答える
5

頭を包み込むために、例を少し短くします。コードを見てみましょう:

char func(char* m) { *m = '4'; return *m; }

int main() {
    char c = '1';
    cout << c << func(&c);

}

cout 行は次のように変換されます。

operator<<(operator<<(cout, c), func(&c))

関数の引数は任意の順序で評価できるため、コンパイラは内部をoperator<<(cout, c)最初に評価するか、最初に評価するかを選択できますfunc(&c)。どちらが最初に評価されるかに応じて、次のいずれかが得られます。

`14`

また

`44`
于 2013-03-05T18:53:48.223 に答える