【问题标题】:Why does this C code work? (It shouldn't) [duplicate]为什么这个 C 代码有效? (不应该)[重复]
【发布时间】:2016-11-21 07:20:56
【问题描述】:

我正在检查一个学生的作业。 任务是将英文字母的数量打印到控制台。 出于某种原因,他所做的工作(第 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”。不管我放了什么,有多少个逗号,它只会取最后一个逗号之后的内容(这是正确的句子)。

那里实际发生了什么?

【问题讨论】:

  • 呃,你是老师吗……你需要的是逗号操作符。
  • 给那个学生 A+。他教你“逗号运算符”。
  • 我很想知道为什么学生写了("%d - %d", last - first + 1);
  • 嗯,我问过许多更有经验的程序员同样的问题,但没有人知道答案。为什么这个逗号运算符甚至存在?太没用了……(-_-')

标签: c comma-operator


【解决方案1】:

这是comma operator 的用法示例之一。如果发生

 ("%d - %d", last - first + 1);

计算逗号运算符 ("%d - %d") 的 LHS 操作数,丢弃结果,然后计算 RHS (last - first + 1) 并作为结果返回。然后将结果分配给amount,因此,amount 保存了last - first + 1 操作的结果。

引用C11,第 6.5.17 章,逗号运算符

逗号运算符的左操作数被评估为void 表达式;有一个 其求值与右操作数求值之间的序列点。那么右边 评估操作数;结果有它的类型和值。

FWIW,在这种情况下,"%d - %d" 只是另一个字符串字面量,它没有任何特殊含义。

【讨论】:

  • 非常感谢。我问过很多比我更有经验的程序员,但没有人知道答案……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2012-11-04
  • 2020-08-07
  • 2016-11-19
相关资源
最近更新 更多