我做了一些看起来像这样的代码:
int foo, bar1 = 4, bar2 = 7;
foo = bar1, bar2; // Look at this expression.
printf("%d", foo);
使用 GCC 编译它,使用-Wall和-Wextra。输出为4
.
除了丑陋之外,这个表达式是未定义的行为,还是foo
总是设置为bar1
?
我做了一些看起来像这样的代码:
int foo, bar1 = 4, bar2 = 7;
foo = bar1, bar2; // Look at this expression.
printf("%d", foo);
使用 GCC 编译它,使用-Wall和-Wextra。输出为4
.
除了丑陋之外,这个表达式是未定义的行为,还是foo
总是设置为bar1
?
它是逗号运算符,主要用于副作用表达式,例如foo = (bar1++, f(bar2));
which increments bar1
、 call function f
withbar2
并将其结果设置为foo
在C中,逗号运算符的优先级低于赋值。
通常e1,e2
(在表达式上下文中)计算左操作数e1
,丢弃其结果,然后计算右操作数e2
并给出右操作数的值(作为整个e1,e2
表达式的值)。
Ocaml 有;
运算符,Scheme 有begin
,Lisp 有progn
类似的目的(评估两个或几个子表达式的副作用,并给出最后一个作为整个结果)。
在该表达式中,您使用的,
运算符从左到右计算操作数并返回最后一个。所以它评估foo = bar1
然后bar2
。
这里
foo = bar1;
为了更深入的了解,
int foo = barx, * barp;
这里,
操作符的意思
int foo = barx;
int *barp;