为什么这段 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" 只是另一个 字符串文字 ,它不带有任何 特殊的 含义。