return ++中的逗号 - C++中逗号运算符的不同行为与返回?



c语言运算符 (5)

尝试应用简单的方法,只是突出显示括号的优先顺序:

( x = 2 ), 3;

return ( 2, 3 );

现在我们可以看到二元运算符“,”以相同的方式从左到右工作。

这(注意逗号运算符 ):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

输出2

但是,如果您通过逗号运算符使用return ,则:

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

输出3

为什么逗号运算符的行为与return有所不同?


根据运算符优先级逗号运算符优先于operator= ,所以x = 2,3; 相当于(x = 2),3; 。 (运算符优先级决定运算符如何绑定到它的参数,根据它们的优先级比其他运算符更紧密或更松散。)

注意逗号表达式是(x = 2),3这里是(x = 2),3 ,而不是2,3 。 首先计算x = 2 (并且其副作用已完成),然后放弃结果,然后评估3 (实际上它什么都不做)。 这就是为什么x的值是2 。 请注意, 3是整个逗号表达式(即x = 2,3 )的结果,它不会用于分配给x 。 (将其更改为x = (2,3); x将分配为3

为了return 2,3; ,逗号表达式为2,3被评估,然后丢弃其结果,然后3作为整个逗号表达式的结果进行评估和返回,后者由稍后的return语句返回

有关ExpressionsStatements其他信息

表达式是一系列运算符及其操作数,用于指定计算。

x = 2,3;表达式语句x = 2,3是这里的表达式。

一个表达式后跟一个分号是一个陈述。

语法: attr(optional) expression(optional) ; (1) attr(optional) expression(optional) ; (1)

return 2,3;跳转语句return语句 ), 2,3是这里的表达式。

语法: attr(optional) return expression(optional) ; (1) attr(optional) return expression(optional) ; (1)


逗号(也称为表达式分隔 )运算符从左到右进行评估。 所以return 2,3; 相当于return 3;

评估x = 2,3;(x = 2), 3; 由于运营商的优先权 。 评估仍然是从左到右, 整个表达式的值为3, x的副作用为2。


这个说法:

  x = 2,3;

由两个表达式组成:

> x = 2
> 3

由于运算符优先级 =比逗号优先级更高,因此x = 2被评估,并且 3 之后 。 那么x将等于2

而是在return

int f(){ return 2,3; }

语言语法是:

return <expression>

注意 return不是表达式的一部分。

所以在这种情况下,这两个表达式将被评估为:

> 2
> 3

但只有第二个( 3 )将被返回。


以下代码对于我来说比目前发布的其他代码更快:(Visual Studio 2013,64位,500 MB文件,行长度均匀地位于[0,1000))。

const int buffer_size = 500 * 1024;  // Too large/small buffer is not good.
std::vector<char> buffer(buffer_size);
int size;
while ((size = fread(buffer.data(), sizeof(char), buffer_size, stdin)) > 0) {
    line_count += count_if(buffer.begin(), buffer.begin() + size, [](char ch) { return ch == '\n'; });
}

它比我们的所有Python尝试都多出2倍。





c++ return language-lawyer operator-precedence comma-operator