i = 1, 2, 3, 4, 5;
这实际上分配1
给i
。
*****我想知道这种类型的作业是否真的有用?*****
你知道这种语法的一些应用吗?
i = 1, 2, 3, 4, 5;
这实际上分配1
给i
。
*****我想知道这种类型的作业是否真的有用?*****
你知道这种语法的一些应用吗?
当您想在 for 循环中说 2 个迭代变量时,此语法非常有用
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()
循环的控制流中使用多个表达式(这实际上是逗号运算符的一种非常合理的用法)。
应用:混淆 C 竞赛!
逗号运算符的另一个常见用途是while
循环条件:
while (c = getchar(), c != EOF && c != '\n')
{
这不是“分配类型”。逗号运算符的绑定非常松散,比赋值更松散。所以你写了相当于:
((((i = 1), 2), 3), 4), 5;
void 上下文中的整数文字是无用的(除了可能避免在某些情况下不执行任何操作的宏中的警告,例如断言),所以不,完全不需要这种语法 - 需要一个将 i 设置为 1 并计算为5 是相当有限的,即使你找到了一个案例,2、3、4 也是多余的。
更有用的可能是i = 1, code_that_actually_does_something;
. 逗号运算符最常见的用途是在不允许多个语句的上下文中潜入多个副作用,例如在“if”和“while”条件或必须作为表达式计算的宏中。
这是逗号运算符,它允许您将多个表达式组合为一个。
编译器将其解析为(i = 1), 2, 3, 4, 5
,因为=
它的优先级高于逗号运算符。
除了在for
循环中,它通常不是很有用,而且它的使用是不受欢迎的。
在作业中,我想不出这个特定示例在哪里有用。
但是,您可以这样做
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);
...