什么是C中的完整表达式?

Abd*_*med 11 c expression operators language-lawyer

我从斯蒂芬普拉塔的"C Primer Plus"一书中学习C语言,结果是:

"完整表达式不是更大表达式的子表达式.完整表达式的示例包括表达式语句中的表达式和用作while循环的测试条件的表达式"

我无法清楚地理解完整表达式的确切定义是什么以及为什么本书认为测试条件是完整表达式.

任何人都可以清楚地解释"完整表达"的含义吗?如何指定表达式是否为完整表达式?

Lun*_*din 12

他直接从C标准中取得了这一点,例如C11 6.8:

充分表达是不是另一个表达式或一声明符的一部分的表达.以下各项都是完整的表达式:不是复合文字的一部分的初始化程序; 表达式中的表达式; 选择陈述(ifswitch)的控制表达; 一个while或一个do陈述的控制表达; for语句中的每个(可选)表达式; return语句中的(可选)表达式.在完整表达式的评估和要评估的下一个完整表达式的评估之间存在序列点.

一些例子是:

if(x)

for(x; y; z)

return x;

其中xy和z是完整表达式.

完整表达是一种语言语法术语,而不是C程序员需要了解的东西.它只与"语言律师"和制作编译器或静态分析器的人有关.C标准涉及语句,完整表达.

程序员可能需要知道的是上面引用的文本的最后一句话,这意味着在完整表达之后,该表达的所有副作用都被执行.因此,如果我编写代码,if(i++) printf("%d", i);那么我知道它i++已经在printf行之前执行了.

然而,在阅读编译器错误时,知道这些干语法术语可能非常有用.比如臭名昭着的"陈述缺失",用简单的英语很可能意味着你忘记了分号.