C中的Double For Loop语法

Jos*_*eph 2 c syntax loops for-loop

我是C的新手,必须编写一些模拟给定函数的代码.但是,我很难理解这段代码中的第二个for循环是什么.语法似乎不符合循环语法的标准:

for ( init; condition; increment ) {
statement(s);
}
Run Code Online (Sandbox Code Playgroud)

这是我正在检查的代码,它是我没有关注的第二个for循环,我没有看到任何在线版本

for (i = 0; i <= (n1-n2); i++){   
    count=0;
    for(j = i,k = 0; k < n2; j++,k++){
        if (*(s1+j)!=*(s2+k)){
            break;
        }
        else
            count++;
        if(count==n2)    
            total++;                         
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设它是两个for循环,因为有两个增量.我认为不平等与'while循环'类似,但我不确定.令人困惑的是,j循环似乎没有条件.我不确定它是否是一个语法快捷方式,或者如果有一个特殊的循环我找不到在线资源.

Sou*_*osh 6

我假设它是两个for循环,因为有两个增量.

好吧,不是真的.第二个for循环也遵循规定的语法,它只是对处理循环相关变量有点花哨.

对于像这样的循环语句

 for(j = i,k = 0; k < n2; j++,k++){
Run Code Online (Sandbox Code Playgroud)

可以解释为

 for( (j = i,k = 0)  ; (k < n2) ; (j++,k++) ){
       ^^^^^^^^^^^      ^^^^^^     ^^^^^^^  
       init            condition    post loop body operation.
Run Code Online (Sandbox Code Playgroud)

现在,初始化和后体表达式块使用逗号运算符.

相关的,引用C11,章节§6.5.17

逗号运算符的左操作数被计算为void表达式; 它的评估与右操作数之间存在一个序列点.然后评估右操作数; 结果有它的类型和价值.

详细说明,相同的语法可以细分为

 j = i;                               //initialization, only once
 for( k = 0  ; k < n2 ; k++ ){        // good ol' syntax
  //......loop body
  j++;                                //last expression in the body.
 }                                    //end of loop
Run Code Online (Sandbox Code Playgroud)