我不明白这里的for循环。有人可以向我解释一下吗?一般。这个缺少第一个陈述,第二个陈述不同的东西。
/* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */
int strcmp(char *s, char *t)
{
for ( ; *s == *t; s++, t++)
if (*s == '\0')
return 0;
return *s - *t;
}
答案 0 :(得分:5)
根据C标准$6.8.5.3
。对于以下声明:
`for(clause_1;expression-2;expession-3) statement`
clause-1
和expression-3
都可以省略,expression-2
可以替换为非零常量。
要从根本上回答你的问题,让我们看看编译器如何处理你的代码。
for
循环stmt 从编译器的角度来看,循环最终将转换为指令序列结束,条件向后跳转指令如下所示。
...
INST1
INST2
COND_JMP LABEL2
LABEL1:
INST3
INST4
INST5
COND_JMP LABEL1
LABEL2:
...
for
&#39; clause-1
将被放在LABEL1之前,例如INST1
和INST2
,因此可以省略此类代码。由于开发人员也可以在for
语句之前放置此类操作。
expression 3
将被放入循环体(LABEL1
和COND_JMP LABEL1
之间的指令序列),因此epression 3
代码也可以直接放入循环体中代码,这就是expression 3
也可以省略的原因。
expression 2
将是COND_JMP
指令使用的条件,因此如果直接省略,则意味着编译器不会在循环体外插入COND_JMP
,这将使{{1} }语句无意义,这就是为什么for
只能被非零常量替换的原因。当用非零常量替换时,意味着在C中总是为真,然后循环将是无限循环。
expression 2
stmt for
根据C标准expression-3
,他的逗号表达式如下。
6.5.17
此处 expression, expression-2, expression-3..., expression-last
可以是普通表达式,也可以是赋值表达式。
对于这样的逗号表达式,编译器将生成将评估所有这些表达式的代码,并返回最后一个表达式的类型和值作为逗号表达式的返回类型和值。
答案 1 :(得分:3)
初始化语句为空。这意味着“没有初始化操作”。
答案 2 :(得分:1)
for
循环的语法是
for ( expression1 ; expression2 ; expression3 ) statement
expression1
和expression3
都可以省略。您也可以省略expression2
以使其成为无限循环。
答案 3 :(得分:1)
任何(for)循环都有三个语句。
初始化
条件
增量
根据要求
,上述任何字段都可以留空for ( ; *s == *t; s++, t++)
这里
初始化:没有初始化
条件:* s == * t(直到两个字符串的字符相等)
增量:s ++,t ++增加两个字符串的指针。
答案 4 :(得分:0)
关于&#39; for&#39;环 第一个参数(可选参数)(仍然需要&#39 ;;&#39;分隔符) (在这种情况下,感兴趣的变量,&#39;和&#39;&#39;是 已经初始化并通过传入的参数提供给函数,因此省略了初始化参数)
第二个参数是条件语句 虽然这个条件是真的,但是&#39; for&#39;循环将继续 被执行。 (在这种情况下,虽然&#39; s指向的字符与&#39; t&#39;)指向的字符相同
第三个参数(可选参数) (在这种情况下,由逗号分隔的两个语句组成,&#39;: 这两个陈述指出了这些指示&#39;并且&#39; t&#39;至 指向各自字符数组中的下一个字符。
答案 5 :(得分:0)
for(exp1; exp2; exp3) /* Body */
语句或多或少是这方面的简写:
exp1;
while (exp2) {
/* Body */
exp3;
}