C++ 中的逗号运算符不计算第二个表达式
comma operator in c++ doesn't evaluate second expression
我写了以下代码:
#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++引入的,允许您将函数原型放在函数体中,这被称为最烦人的解析。
相关文章:
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 计算两个代码块的时间复杂度
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 将第二个 GATT 服务添加到 Movesense 容器
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 使第二个类的构造函数成为第一个类中的友元函数
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
- 打印无序映射的第二个元素,即集合
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 从第二个导数计算的曲线的SIMD优化
- C++ 中的逗号运算符不计算第二个表达式
- 在有效地计算数组中第二个元素较少的对时,我哪里错了