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

时间:2015-04-20 15:56:11

标签: 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;
}

6 个答案:

答案 0 :(得分:5)

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

 `for(clause_1;expression-2;expession-3) statement` 

clause-1expression-3都可以省略,expression-2可以替换为非零常量。

编译器的操作

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

对于代码中的for循环stmt

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

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

LABEL2:
   ...

for&#39; clause-1将被放在LABEL1之前,例如INST1INST2,因此可以省略此类代码。由于开发人员也可以在for语句之前放置此类操作。

expression 3将被放入循环体(LABEL1COND_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  

expression1expression3都可以省略。您也可以省略expression2以使其成为无限循环。

答案 3 :(得分:1)

任何(for)循环都有三个语句。

  1. 初始化

  2. 条件

  3. 增量

  4. 根据要求

    ,上述任何字段都可以留空
    for ( ; *s == *t; s++, t++)
    

    这里

    1. 初始化:没有初始化

    2. 条件:* s == * t(直到两个字符串的字符相等)

    3. 增量: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;
}