题
i = 1, 2, 3, 4, 5;
这实际上分配到1
i
。
*****不知这类型的分配是真正有用的某处?*****
你知道这个语法的一些应用?
解决方案
这不是一个“类型分配的”。逗号操作符结合非常松散,比分配宽松。所以,你已经写等价的:
((((i = 1), 2), 3), 4), 5;
在空情境整数文字是无用的(除非是避免警告,因为在某些情况下,什么都不做的宏,像断言),所以没有,有没有用了整整这个语法 - 其必要性将i为1的表达和计算结果为5是相当有限的,并且即使你发现该情况下,2,3,4是多余的。
更多有用可以i = 1, code_that_actually_does_something;
。最常见的用逗号的是在上下文多的副作用偷偷在那里你不允许多条语句,如“如果”和“而”条件,或者说必须评估为表达式的宏。
其他提示
当你想有发言权2个迭代变量在for循环中这个语法是非常有用的。
for ( i = 0, j = 0; i < 10 && j < 10; i++ ) {
..
}
这是逗号运算符,C的优先级最低操作。据C中的优先规则,即行解析为这样:
(i = 1), (2), (3), (4), (5);
这可能是“有用的”,如果你想要做该线路上的其他东西:
i = 2, j = 3, k++;
,你可以节省使用括号的if()
声明(也可引起头痛更高版本)或允许你在一个for()
循环的控制流的多个表达式(这其实是一个相当合法使用逗号操作符的)。
应用:所述混淆后ç比赛
为逗号运算另一个常见用途是在环while
条件:
while (c = getchar(), c != EOF && c != '\n')
{
在一个赋值,我无法想到这里该特定示例中是有用的。
您可以,但是,做
x = 1, y = 2, z = 3;
和它们将被视为一个单独的语句,并且评价从(根据C89)左到右。
作为他人已经指出:这种结分配1到i,然后评估2,然后是3,然后4,然后5.语句的整体值,然后5(最后计算的表达式)
。当你想创建一个宏,做几件事情,并返回像一个函数的值这是有用的:
#define STEAL_MAGIC_HAT(thing1, thing2, cat) \
(smack(thing1), punch(thing2),get_hat(cat))
extern thing_t g_thing1, g_thing2;
extern cat_t g_cat;
...
hat_t hat = STEAL_MAGIC_HAT(g_thing1, g_thing2, g_cat);
don(hat);
...
不隶属于 StackOverflow