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

What is a full expression in C?

我从 Stephen Prata 的 "C Primer Plus" 书中学习 C 语言,结果到了:

"A full expression is one that’s not a subexpression of a larger expression.Examples of full expressions include the expression in an expression statement and the expression serving as a test condition for a while loop"

我不太明白什么是完整表达式的确切定义,以及为什么本书认为测试条件是完整表达式。

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

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

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

A sub-expression 不只是较大表达式的任何部分。

考虑:

2 * 3 + 4 * 5

这里的 3+4*5 不是 sub-expression.

完整表达式解析为

(2 * 3) + (4 * 5)

所以直接的 sub-expression 是 2*3 和 4*5。

其中的每一个再次解析为更小事物的组合,其中 2*3 由 sub-expressions 2 和 3 组成,4*5 由 sub-expressions 4 和 5 组成.

这些 sub-expression 的 sub-expression 是原始完整表达式的间接 sub-expression,所以它总共有这些 sub-expression:2*3, 4*5, 2, 3, 4 and 5.

虽然例如3+4*5 不是 sub-expression。

他直接从 C 标准中提取了这个,例如 C11 6.8:

A full expression is an expression that is not part of another expression or of a declarator. Each of the following is a full expression: an initializer that is not part of a compound literal; the expression in an expression statement; the controlling expression of a selection statement (if or switch); the controlling expression of a while or do statement; each of the (optional) expressions of a for statement; the (optional) expression in a return statement. There is a sequence point between the evaluation of a full expression and the evaluation of the next full expression to be evaluated.

一些例子是:

if(x)

for(x; y; z)

return x;

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

完整表达式 是一个语言语法术语,并不是 C 程序员真正需要了解的内容。它只与 "language lawyers" 和那些制作编译器或静态分析器的人有关。 C 标准谈​​到 statementsblocksfull expressions.

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

然而,在阅读编译器错误时了解这些枯燥的语法术语可能非常有用。例如臭名昭​​著的 "statement missing",用简单的英语来说,这很可能意味着您忘记了分号。

考虑下面的陈述

a = b + c;

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