c++ - C/C++ 逗号运算符让我困惑。语言律师?

标签 c++ visual-c++

我在 Boost 文档的示例中遇到了这段代码:

std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;

真可爱。 Boost 有一个 operator+= 的模板,它利用了逗号在大多数情况下是一个运算符这一事实。 (明智的做法是,C++ 不允许黑客重载“operator,”。)

我也喜欢写可爱的代码,所以我尝试了一些逗号运算符。我发现了一些对我来说很奇怪的东西。你认为下面的代码会打印出什么?

#include <iostream>
int main() {
    int i;
    i = 1,2;
    std::cout << i << ' ';
    i = (1,2);
    std::cout << i << std::endl;
}

你猜对了。 VC++ 2012 打印“1、2”。这是怎么回事?

[编辑:我应该更准确。应该说 C++ 不允许重载 int 列表中的运算符“,”。或者更好的是,什么都没有。可以为类和枚举重载 ',' 运算符。]

最佳答案

案例 1:

i = 1,2;

= 的优先级高于 ,

因此,1 被分配给 i

由于赋值在 c++ 中计算为 lvalue,(在 c 中计算为 rvalue)它变成了 i,2 计算结果为2(引用注释)

案例 2:

i = (1,2);

() 的优先级高于 =

expressionsoperands 分隔, 运算符计算最后一个 expression 的值操作数 因此,2 被分配给i


注意

33,77,x,y,z 这样的 comma expression 是从从左到右求值的。

这样的逗号表达式的结果是最右边的表达式的值。

例子

Consider, int z=100; 
then
1,4,5; //evaluates to 5
1,100,z+100; //evaluates to 200

关于c++ - C/C++ 逗号运算符让我困惑。语言律师?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12732454/

相关文章:

C++ - 将 wchar_t 转换为网络字节并返回

C++程序内存计算

c++ - .cpp 和 .c 文件的替换引用

c++ - 编译器生成的默认构造函数如何比自己编写的只初始化成员的构造函数更有效?

c++ - 错误 C3074 : an array can only be initialized with an initializer-list

c++ - 需要帮助来阻止程序在未经用户同意的情况下终止

Visual Studio 上的 C 或 C++

c++ - std::string 等效于具有空字符的数据?

c++ - Google Test 找不到用户提供的相等运算符

c++ - hiredis ,如何检查是否有更多数据可供读取