我不明白这里的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;
}
Run Code Online (Sandbox Code Playgroud)
根据C标准$6.8.5.3.对于以下声明:
`for(clause_1;expression-2;expession-3) statement`
Run Code Online (Sandbox Code Playgroud)
二者clause-1并expression-3可以被省略,并且expression-2可以通过一个非零常数来代替.
要从根本上回答你的问题,让我们看看编译器如何处理你的代码.
for代码中的循环stmt从编译器的角度来看,循环最终将转换为指令序列结束,条件向后跳转指令如下所示.
...
INST1
INST2
COND_JMP LABEL2
LABEL1:
INST3
INST4
INST5
COND_JMP LABEL1
LABEL2:
...
Run Code Online (Sandbox Code Playgroud)
for的clause-1将LABEL1,如前放INST1和INST2,因此它是确定忽略这样的代码.由于开发人员也可以在for声明之前进行此类操作.
expression 3将被放入循环体(LABEL1和之间的指令序列COND_JMP LABEL1),因此epression 3代码也可以直接在c代码中放入循环体,这也是为什么expression 3也可以省略.
expression 2将是COND_JMP指令使用的条件,因此如果直接省略,则意味着编译器不会插入COND_JMP循环体外,这将使for语句无意义,这就是为什么expression 2只能用非零常量替换.当用非零常量替换时,意味着在C中始终为真,然后循环将是无限循环.
forstmt 的逗号expression-3根据C标准6.5.17,他的逗号表达如下.
expression, expression-2, expression-3..., expression-last
Run Code Online (Sandbox Code Playgroud)
这里expression可以是正常表达式,也可以是赋值表达式.
对于这样的逗号表达式,编译器将生成将评估所有这些表达式的代码,并返回最后一个的类型和值作为逗号exression的返回类型和值.