for循环中的参数,缺少第一个?

All*_*age 2 c for-loop

我不明白这里的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)

Kun*_*ing 5

根据C标准$6.8.5.3.对于以下声明:

 `for(clause_1;expression-2;expession-3) statement` 
Run Code Online (Sandbox Code Playgroud)

二者clause-1expression-3可以被省略,并且expression-2可以通过一个非零常数来代替.

编译器的动作

要从根本上回答你的问题,让我们看看编译器如何处理你的代码.

对于for代码中的循环stmt

从编译器的角度来看,循环最终将转换为指令序列结束,条件向后跳转指令如下所示.

   ...
   INST1
   INST2
   COND_JMP LABEL2
LABEL1:
   INST3
   INST4
   INST5
   COND_JMP LABEL1

LABEL2:
   ...
Run Code Online (Sandbox Code Playgroud)

forclause-1将LABEL1,如前放INST1INST2,因此它是确定忽略这样的代码.由于开发人员也可以在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的返回类型和值.