0

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

int foo, bar1 = 4, bar2 = 7;

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

printf("%d", foo);

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

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

4

3 回答 3

1

它是逗号运算符,主要用于副作用表达式,例如foo = (bar1++, f(bar2));which increments bar1、 call function fwithbar2并将其结果设置为foo

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

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

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

于 2013-08-29T17:36:07.870 回答
1

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

于 2013-08-29T17:39:09.763 回答
0

这里

foo = bar1;

为了更深入的了解,

int foo = barx, * barp;

这里,操作符的意思

int foo = barx;
int *barp;
于 2013-08-29T18:11:03.203 回答