在for循环中I_n_test = I_N是什么意思?

时间:2020-06-09 07:22:27

标签: c loops for-loop syntax

我正在尝试在此处理解代码:http://devernay.free.fr/vision/src/prosac.c

主要是因为我想将其翻译成python。

这是一个代码段:

for(n_test = N, I_n_test = I_N; n_test > m; n_test--) { 
  // Loop invariants:
  // - I_n_test is the number of inliers for the n_test first correspondences
  // - n_best is the value between n_test+1 and N that maximizes the ratio                       
  I_n_best/n_best
  assert(n_test >= I_n_test);
  ...
  ...
  // prepare for next loop iteration
  I_n_test -= isInlier[n_test-1];
} // for(n_test ...

那么循环语句中的I_n_test = I_N;有什么作用?

这是停止状态吗?那不是"=="吗?

3 个答案:

答案 0 :(得分:2)

您可以阅读

 for(n_test = N, I_n_test = I_N; n_test > m; n_test--)

 for (initialization ; loop-checking condition; increment/decrement)

根据规范,第§6.8.5.3C11

声明

  for ( clause-1 ; expression-2 ; expression-3 ) statement

的行为如下:表达式expression-2是控制表达式,它是 在每次执行循环主体之前进行评估。表达式expression-3是 每次执行循环主体后,将其评估为void表达式。如果clause-1是一个 声明,它声明的任何标识符的范围是声明的其余部分,并且 整个循环,包括其他两个表达式;按执行顺序达到 在对控制表达式进行第一次评估之前。如果clause-1是表达式,则为 在对控制表达式进行第一次评估之前将其评估为无效表达式。

因此,根据语法,n_test = N, I_n_test = I_N是包含初始化语句的表达式。它们之间用comma operator隔开。

答案 1 :(得分:1)

for(n_test = N,I_n_test = I_N; n_test> m; n_test-)

它初始化I_n_test = I_N&n_test = N,并且两个变量都必须用“,”而不是“;”分隔。 。 如果使用分号分隔,则即使您初始化I_n_test = I_n,编译器也将I_n_test = I_n作为条件而不是初始化。 因此,它就像循环中的变量Assignment一样工作。

答案 2 :(得分:0)

I_n_test = I_N;)是否处于停止状态?

不,它不是条件的一部分。

那不是"=="吗?

否,=完全合适。

那么I_n_test = I_N;在循环语句中做什么?

I_n_test = I_N只是变量I_n_test的初始化/赋值,因为它是for循环标题的三个部分的 first 的一部分由;

以下是语法的展开显示:

for (
      initializations (optional)  
      ;
      condition (obliged if it shouldn't be an endless loop)  
      ;
      in- and/or decrementation (optional if the condition can be influenced 
    )                           inside the loop´s body or as side effect of 
                                the condition itself) 

由于有两个初始化,因此在第一部分中需要用,逗号分隔。否则,这将是一个语法错误。

要了解有关逗号运算符的更多信息,请查看:

What does the comma operator , do?


由于n_testI_n_test都在循环之前声明,

for (n_test = N, I_n_test = I_N; n_test > m; n_test--) { ... 

基本上等同于:

n_test = N;
I_n_test = I_N;

for (; n_test > m; n_test--) { ...

但是分配被带入循环头,以显示变量n_testI_n_test在循环上下文中至少具有其主要目的之一。