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

时间:2018-02-20 07:39:58

标签: c operators expression language-lawyer

我从斯蒂芬普拉塔(Stephen Prata)的“C Primer Plus”一书中学习C语言并且它达到了这一点:

  

“完整表达式不是更大的子表达式   表达式。完整表达式的示例包括表达式   表达式语句和用作测试条件的表达式   一段时间循环“

我无法清楚地了解完整表达式的确切定义以及本书认为测试条件为完整表达式的原因。

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

3 个答案:

答案 0 :(得分:12)

他直接从C标准,例如C11 6.8:

  

完整表达式是一个不属于另一个表达式或声明符的表达式。   以下各项都是完整表达式:不是化合物一部分的初始化程序   文字;表达式中的表达式;选择的控制表达   声明(ifswitch);控制whiledo语句的表达式;每   for语句的(可选)表达式;返回中的(可选)表达式   声明。在完整表达式的评估与之间存在一个序列点   评估下一个要评估的完整表达式。

一些例子是:

if(x)

for(x; y; z)

return x;

其中x y和z是完整表达式

完整表达是一个语言语法术语,并不是C程序员需要了解的东西。它只与语言律师和#34;以及制作编译器或静态分析器的人。 C标准涉及语句完整表达式

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

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

答案 1 :(得分:2)

运算符及其操作数构成一个简单的表达式,称为 完整表达式

复合表达式 可以通过使用更简单的表达式作为不同类型运算符的操作数来形成。表达式中运算符的求值顺序将由C语言中遵循的运算符优先级规则确定。

子表达式 不只是更大表达式的任何部分。

考虑:

2 * 3 + 4 * 5

这里3 + 4 * 5不是子表达式。

完整表达式解析为

(2 * 3) + (4 * 5)

所以直接子表达式是2 * 3和4 * 5.

每个都再次解析为较小的东西的组合,2 * 3由子表达式2和3组成,4 * 5由子表达式4和5组成。

子表达式的这些子表达式是原始完整表达式的间接子表达式,因此它总共具有以下子表达式:2*3, 4*5, 2, 3, 4 and 5.

虽然例如3+4*5不是子表达式。

答案 2 :(得分:2)

考虑下面的陈述

a = b + c;

a = b + c是一个表达式,它不是任何较大表达式的子表达式。这称为完整表达 b + c是较大表达式a = b + c的子表达式,因此它不是完整表达式。 b也是完整表达式a = b + c和子表达式b + c的子表达式。