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)是的,和两者的评估顺序c1是未指定的。

这意味着可以按任何顺序评估这三个表达式,从而产生以下任何输出:

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 回答