为什么C语言允许这样做?它的作用是什么?即使不必要,也可以在此处查看完整程序http://www.learntosolveit.com/cprogramming/Ex_1.18_remtrailbt.html。
for (i > 0; ((s[i] == ' ') || (s[i] == '\t')); --i)
for (i > 0; ((s[i] == ' ') || (s[i] == '\t')); --i)
for
语句的第一个子句可以是声明,也可以是(在本例中)空上下文中的表达式。这意味着第一个子句会被求值以获取其副作用,通常是赋值,它是一种表达式。
C标准的6.8.5.3节如下定义for
语句:
1 语句
for (子句1; 表达式2; 表达式3) 语句
的行为如下:表达式 expression-2 是控制表达式,在每次执行循环体之前计算。表达式 expression-3 是在每次执行循环体之后作为无效表达式计算。如果 clause-1 是一个声明,则它所声明的任何标识符的范围是声明的其余部分和整个循环,包括其他两个表达式;它在第一次评估控制表达式之前按执行顺序到达。如果 clause-1 是一个表达式,则在第一次评估控制表达式之前将其作为无效表达式计算。
2 子句1和表达式3都可以省略。省略的表达式2将被替换为非零常数。
在 for
语句的第一个子句中,允许使用任何表达式。在这种情况下,表达式 i > 0
被计算但没有副作用,因此它实际上什么也没做。这与以下代码相同:
for (; ((s[i] == ' ') || (s[i] == '\t')); --i)
if ((result=foo()) == 0)
。 - dbush
i
减少到零以下(或小于-1),但编写了错误的代码,因此完整的意图不清楚。 - Eric Postpischil