【问题标题】:If statement in for loop -infinite loopfor 循环中的 if 语句 - 无限循环
【发布时间】:2014-09-25 14:01:05
【问题描述】:

我有以下代码,我在其中运行嵌套 for 循环,并在循环内检查语句是否为真。如果是这样,则加载内核并使用内核执行卷积。主要是输入图像。

当我运行代码时,它变成了一个无限循环。我不明白为什么。

for(m=0;m<h;m++)
{
    for(k=0;k<v;k++)
    {        
        if( (m = 261) && (k=361))
        { 
            printf("%f", Thickness[m][k]);
            printf("%d,%d",m,k);
            sprintf(fn,"F:\\newresult\\fft\\neww8_25.raw");
            if ((f2=fopen( fn, "rb" )) == NULL)
            {
                printf("Pb lecture fichier %s\n", fn);
                exit(1);
            }
            for(int a = 0; a < krow; ++a)
                for(int b = 0; b < kcol; ++b)
                    fread(&Kernel[a][b], sizeof(float), 1, f2);
            fclose(f2);
            for(int a = 0; a < krow; ++a)
                for(int b = 0; b < kcol; ++b)
                    sum+=Kernel[a][b];
            for(int a = 0; a < krow; ++a)
                for(int b = 0; b < kcol; ++b)
                    Kernel[a][b] /= sum;
            //convolute 
            s1 = convolve2D(primary, s1, m, k, Kernel, krow , kcol);
        }
    }
}

【问题讨论】:

  • 如果您启用编译器警告,编译器将帮助指出简单的错误,例如if( (m = 261) &amp;&amp; (k=361))
  • 我认为 if( (m = 261) && (k=361)) 这应该是 if( (m == 261) && (k==361))
  • 声明 if ((m = 261) &amp;&amp; (k=361)) 将始终为真,并将 mk 设置为这些值。我们不知道 hv 是什么,但它们小于 261​​ 和 361。您需要比较相等性,==,而不是赋值,=,在这里。
  • 非常感谢。如果我必须大于或小于?
  • 有趣的是,在if ((f2=fopen( fn, "rb" ))==NULL) 行中,您已经正确使用了这两个不同的运算符。

标签: c if-statement for-loop


【解决方案1】:

if ((m = 261) &amp;&amp; (k=361))这是一个作业。
如果你想比较一些东西:

  • 对于相等,使用==
  • 对于更少/更大:&lt;/&gt;
  • 对于不等式:!=

if(f2 == nullptr)
if(!f2)

两种情况是相等的。如果 f2 null,则...

if(f2 != nullptr)
if(f2)

如果 f2 为空,那么...


注意: nullptr 是 c++11 的特性。如果您不使用 c++11,请使用 NULL insead。

编辑:正如@unwind 评论的那样,有两个任务。
由于261 始终为非零,因此第一个条件始终为真。它将继续评估右侧并将361 分配给k

【讨论】:

  • 实际上是 两个 赋值,因为 261 总是非零,&amp;&amp; 将继续计算右侧,也赋值给 k。 :)
【解决方案2】:

您在此处为m 赋值:if( (m = 261) &amp;&amp; (k=361)) 这始终是正确的(因为它是非零值)。 它应该是 if( (m == 261) &amp;&amp; (k==361))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多