为什么这段 C 代码有效? (不应该)
Why does this C code work? (It shouldn't)
我正在检查学生的作业。
作业是将英文字母的数量打印到控制台。
出于某种原因,他所做的工作(第 7 行):
int main(void)
{
char first = 'A';
char last = 'Z';
int amount = 0;
amount = ("%d - %d", last - first + 1);
printf("The amount of letters in the English alphabet is %d\n", amount);
return(0);
}
看到之后,我试着把其他的东西放在括号里,而不是“%d - %d”。不管我放什么,有多少个逗号,它只会取最后一个逗号后面的内容(这是正确的句子)。
那里到底发生了什么?
这是comma operator的用法示例之一。如果
("%d - %d", last - first + 1);
计算逗号运算符的 LHS 操作数 ("%d - %d"
),结果被丢弃,然后计算 RHS (last - first + 1
) 并将其作为结果返回。然后将结果分配给 amount
,因此,您有 amount
保存操作结果 last - first + 1
.
引用 C11
,章节 §6.5.17,逗号运算符
The left operand of a comma operator is evaluated as a void
expression; there is a
sequence point between its evaluation and that of the right operand. Then the right
operand is evaluated; the result has its type and value.
FWIW,在这种情况下,"%d - %d"
只是另一个 字符串文字 ,它不带有任何 特殊的 含义。
我正在检查学生的作业。 作业是将英文字母的数量打印到控制台。 出于某种原因,他所做的工作(第 7 行):
int main(void)
{
char first = 'A';
char last = 'Z';
int amount = 0;
amount = ("%d - %d", last - first + 1);
printf("The amount of letters in the English alphabet is %d\n", amount);
return(0);
}
看到之后,我试着把其他的东西放在括号里,而不是“%d - %d”。不管我放什么,有多少个逗号,它只会取最后一个逗号后面的内容(这是正确的句子)。
那里到底发生了什么?
这是comma operator的用法示例之一。如果
("%d - %d", last - first + 1);
计算逗号运算符的 LHS 操作数 ("%d - %d"
),结果被丢弃,然后计算 RHS (last - first + 1
) 并将其作为结果返回。然后将结果分配给 amount
,因此,您有 amount
保存操作结果 last - first + 1
.
引用 C11
,章节 §6.5.17,逗号运算符
The left operand of a comma operator is evaluated as a
void
expression; there is a sequence point between its evaluation and that of the right operand. Then the right operand is evaluated; the result has its type and value.
FWIW,在这种情况下,"%d - %d"
只是另一个 字符串文字 ,它不带有任何 特殊的 含义。