我做了一些看起来像这样的代码:
int foo, bar1 = 4, bar2 = 7;
foo = bar1, bar2; // Look at this expression.
printf("%d", foo);
使用GCC编译, -Wall 和 -Wextra 。
输出为4
。
除了丑陋之外,这个表达式是未定义的行为,还是foo
始终设置为bar1
?
答案 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;