我写了以下代码:
#include <iostream>
using namespace std;
int f()
{
cout << "f()" << endl;
return 3;
}
int v()
{
cout << "v()" << endl;
return 4;
}
int main()
{
int m = f(),v();
cout << m << endl;
return 0;
}
我希望它打印:
f()
v()
3
使用g++ -O0 test.cpp -o test.out
和运行结果进行编译:
f()
3
为什么省略了对 v 的调用?(这不能做优化,因为我添加了标志-O0
)
int m = f(),v();
此语句执行 f() 并将返回值分配给 m,然后声明返回 int 类型的函数v()
。 int v();
也称为最令人烦恼的解析。
要实现comma operator
测试,请尝试:
int m;
m = f(),v();
cout << m << endl;
查看实时样本。
以下代码变体演示了此操作:
http://ideone.com/GBae0p
#include <iostream>
int f() { std::cout << "f()" << std::endl; return 1; }
int main() {
int t = f(), v();
std::cout << t << std::endl;
return 0;
}
即使我们没有"v()",也可以毫无错误地编译。
逗号运算符正在拆分此行
int t = f(), v();
到
int t = f();
int v();
第二行是一个函数原型,它声明将有一个函数 int v()
,它不带参数并返回一个 int。
不调用它,它只是预先声明它 - 以防编译器在实际定义之前遇到对它的调用 - 因为主体是一个空语句(;
)。编译器假设我们将在稍后或在不同的编译单元中实现它。
因为这通常会混淆经验和新程序员,因为它是由C++引入的,允许您将函数原型放在函数体中,这被称为最烦人的解析。