“foo = bar1,bar2”有什么作用?

时间:2013-08-29 17:32:42

标签: c expression undefined-behavior

我做了一些看起来像这样的代码:

int foo, bar1 = 4, bar2 = 7;

foo = bar1, bar2; // Look at this expression.

printf("%d", foo);

使用GCC编译, -Wall -Wextra 。 输出为4

除了丑陋之外,这个表达式是未定义的行为,还是foo始终设置为bar1

3 个答案:

答案 0 :(得分:1)

这是comma operator,主要用于像foo = (bar1++, f(bar2));这样的副作用表达式增加bar1,用f调用函数bar2并设置其结果到foo

C 中,逗号运算符的优先级低于赋值。

通常e1,e2(在表达式上下文中)计算左操作数e1丢弃其结果,然后计算右操作数e2并给出值右操作数的值(作为整个e1,e2表达式的值)。

Ocaml有;运算符,Scheme有begin,Lisp有progn用于类似目的(评估两个或几个子表达式的副作用,并给出最后一个作为整体结果)。

答案 1 :(得分:1)

在该表达式中,您使用,运算符从左到右计算操作数并返回最后一个。因此,它会评估foo = bar1,然后评估bar2

答案 2 :(得分:0)

这里

foo = bar1;

为了更深入的理解,

int foo = barx, * barp;

此处,运营商意味着

int foo = barx;
int *barp;