我对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。 我的错误在哪里?
谢谢!
答案 0 :(得分:4)
if(m = 0);
result = 1;
相当于
if(m = 0)
;
result = 1;
您需要从;
语句的末尾删除for
。
您还需要使用==
进行比较。 m=0
将0
分配给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 -= 1
或exp = 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)
if ( / * Some condition * /);
基本上意味着if(/*whatever*/)
做;
即没有
而不是
if(/*Something*/)
/*i do it my way*/ ;
或更好
if(/*Something*/)
{
/*i do it my way*/ ;
}
=是赋值,==等于测试者
if(m = 1);
这意味着将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;
}