C 中的函数始终返回相同的任意数



所以我试图获得任意两个数字的幂,

int expo(int base, int expon){
int z = 1;
printf("%i",&z);  // Here i get 635678
if (expon == 0){
printf("A");  // this gets printed if expon== 0
return 1;
}
else{
for (int x=0; x < expon; x++){ 
z *= base;
printf("%i",&z); // here i get 6356780
}
return z;
}
}

最让我惊讶的是第一个635678,我刚刚告诉计算机z = 1!,第二个是当它打印A时,它甚至不返回1。它总是返回6356776。(我只是将一个 int 值声明为函数的结果并打印 int,也许我什至做得很糟糕(。我不关心这个特定的功能,我只想知道我在告诉计算机什么,因为它显然不是我想的那样。 谢谢和抱歉,因为这个问题很有可能不应该在这里。

好吧,你这样做做错了:

printf("%i",&z);

%i用于打印整数,但您传递的是指向整数的指针- 您应用&(地址(运算符。

这是未定义的行为。简单的解决方案:移除&


我有一个理论,你是如何得到这个代码的:你可能被教导使用scanf()来读取输入(我会质疑的另一件事,但让我们暂时把它放在一边(。

使用scanf(),您需要使用%i转换说明符传递指向int的指针。但那是因为scanf()必须设置变量的值,就像在 C 中一样,变量是按值传递的,这只能通过指针来实现。

另一方面,printf()只需要一个值来打印,它不必修改任何东西。因此,它直接期望此值,而不是指向它的指针。

您正在打印变量 z 的内存中的位置,而不是 z 包含的值。 如果你把 & 放在变量前面,你会得到内存中的地址,只需输入 printf("%i", z( 即可获得他的值。

printf("%i",&z);

在这里,您打印的是 z 的地址,而不是其值。相反,你想要的是:

int expo(int base, int expon){
int z = 1;
printf("%d",z);
if (expon == 0){
printf("A");  // this gets printed if expon== 0
return 1;
}
else{
for (int x=0; x < expon; x++){ 
z *= base;
printf("%d",z);
}
return z;
}
}

只需将 & reference 运算符放在 z 前面即可。

最新更新