C中for循环的基本问题

时间:2013-11-13 07:45:43

标签: c for-loop

我对C编程非常陌生[昨晚我的丈夫决定让我把伪代码转换成一个有效的C程序......]所以我为这可能有多么简单而道歉。我也是stackoverflow的新手,所以如果我犯了任何基本错误,请告诉我。

我写了以下内容:

 int CalcPower(int n, int m)
{
    int result = 1;
    int i;
    if(m = 0);
    result = 1;
    if(m = 1);
    result = n;
    for (i = 2; i <= m; i++);
    {
        result = result*n;
    }
    return result;
}

但我用数字(2,4)和(2,8)运行它,无论如何结果都是4。 我的错误在哪里?

谢谢!

6 个答案:

答案 0 :(得分:4)

if(m = 0);
result = 1;

相当于

if(m = 0)
    ;
result = 1;

您需要从;语句的末尾删除for

您还需要使用==进行比较。 m=00分配给m,然后返回0,导致if条件失败。

if(m == 0)
    result = 1;

答案 1 :(得分:3)

是的,有些事情,首先是其他人在他们的回答中也有所说明:

  • 当您需要比较运算符时,您正在使用赋值运算符:=分配,==比较。
  • 分号是语句的结尾,;是一个空的但有效的语句,所以if(m ==0);说:“如果m为0,则什么都不做”。您的for循环遇到同样的问题。
  • 正如我在评论中所说:为什么如果你知道答案就分配:if(m==0) result = 1;有点多余,恕我直言,我只想写if (m == 0) return 1;

现在,别的东西:
你正在计算一个int,以另一个int的力量。从技术上讲,2 ^ 33应该“可计算”,但是int只是不够大。这是另一种建议:

long long calc_power(int i, unsigned int exp)
{
    long long result;
    if (exp == 0) return 1;
    result = i;
    for (--exp;exp;--exp) result *= i;
    return result;
}

我还删除了if (exp == 1),就像编写循环的方式一样,它现在可以处理它。
声明值得解释:

long long calc_power(int i, unsigned int exp)

我稍微更改了函数的签名:它现在返回一个long long值,以容纳更大的值, -function>函数的函数可能会返回。我还宣布第二个论点是unsigned int,以避免必须处理负面力量。你的功能尚未准备就绪,但你没有检查是否m < 0,你只是假设它是有效的输入。

if (exp == 0) return 1;

注意:在右括号后没有分号

result = i;

这会将int提升为long long值,并自动将i ^ 1分配给result

for(--exp;exp;--exp) result *= i;

这里有很多事情要发生。首先,循环以--exp开头,与exp -= 1exp = exp -1;相同。
循环继续的条件只是exp。如果exp为0,则计算结果为假。假设exp为1,则开始循环会自动将exp设置为0,并且永远不会输入循环。如果exp是&gt; 1,然后循环继续,递减exp,直到它也达到零 在每次迭代result *= i;上计算result = result * i的缩写 完成所有操作后,return result会返回long long值...

正如H2CO3指出的那样,这个片段可以进一步简化:

long long calc_power(int i, unsigned int exp)
{
    long long result = 1;//assign 1
    for (;exp;--exp) result *= i;
    return result;
}

而不是检查exp == 0,只需从一开始就将{1}分配给result,然后从那里拿东西就可以了...... 请注意,for(;exp;--exp)不是拼写错误。第一个分号必须存在,但没有表达需要在那里进行评估。如果您找到for (exp;exp;--exp),那也可以。

注意:
这个函数“还没准备好生产”,这只是一个人们如何计算i1^i2的基本示例,对于pow函数的更完整示例,看看here,看看你是否可以弄清楚代码是如何工作的。你可能需要更多的信息,也许还需要一本关于C语言的书,不过

答案 2 :(得分:0)

也是for-loop

 for (i = 2; i <= m; i++); should be for (i = 2; i <= m; i++){ ...

你的for循环将从i = 2 to m递增运行,但它不能反映在它下面要执行的逻辑。

答案 3 :(得分:0)

你的问题在这里:

for (i = 2; i <= m; i++);

您需要从此行的末尾删除;;目前,这只是有效的:

for (i = 2; i <= m; i++)
    /* No instructions to execute */;

答案 4 :(得分:0)

  1. 分号结束声明;
  2. if ( / * Some condition * /);

    基本上意味着if(/*whatever*/);即没有 而不是

    if(/*Something*/)
    /*i do it my way*/ ;
    

    或更好

    if(/*Something*/)
    {
    /*i do it my way*/ ;
    }
    
    1. =是赋值,==等于测试者

      if(m = 1);

    2. 这意味着将1分配给m Assignment operator返回RHS,使其变为

      if(1)
      {
      
      }
      

      表示if(true)

答案 5 :(得分:-1)

if(m = 0);表示你为变量m赋值为0,所以它永远不会是真的。所以你在if语句中加上 ';' 所以后面的语句是如果不受条件的影响。

'=' is an assignment operator

'==' is the comparison operator


int CalcPower(int n, int m)
{
    int result = 1;
    int i;
    if(m == 0)
    result = 1;
    if(m == 1)
    result = n;
    for (i = 2; i <= m; i++)
    {
        result = result*n;
    }
    return result;
}