我在C编程课上,老师说,由于 * 技术原因 ,通过值传递参数到某个函数并将修改后的参数返回到调用函数中不是一个好的做法。他没有说明技术原因是什么?
我知道通过引用传递一个值意味着什么,我知道如何使用它,我想我知道通过引用传递和通过引用传递之间的区别。我就是不明白为什么我不能在某些情况下,从main
通过值传递参数到函数,修改它,然后返回给main
。
这是我的节目单。我的老师说: “因为askDecimals
中的sum
变量是一个值参数(通过值传递),所以它不能向调用程序返回信息”*。
我明白,我在这里进行了不好的实践,在main
函数中声明sum
并将其通过值传递到askDecimals
。相反,我应该在askDecimals
函数中声明sum
变量。
但不管怎样,我老师的评论至少对我来说,听起来你永远不能把一个值作为参数传递并返回它。
如果我对老师的理解有误,请纠正我。
#include <stdio.h>
#include <string.h>
void askName(char *pName) {
printf("Enter a name, maximum 20 characters: ");
fgets(pName, 20, stdin);
pName[strlen(pName)-1] = '\0';
return;
}
float askDecimals(float sum, int count) {
float decimal;
for (int i = 0; i < count; i++) {
printf("Enter a decimal number: ");
scanf("%f", &decimal);
getchar();
sum = sum + decimal;
}
return sum;
}
void printInfo(int count, char *pName, float sum, float avg) {
printf("You entered the name: %s.\n", pName);
printf("You entered the number: %d.\n", count);
printf("The sum of the decimal numbers was: %f.\n", sum);
printf("The average of the decimal numbers was: %.2f.\n", avg);
return;
}
int main(void) {
char name[20];
int count;
float sum = 0;
float avg;
askName(name);
do {
printf("Enter a positive integer: ");
scanf("%d", &count);
getchar();
if (count <= 0) {
printf("You must enter a positive integer. Please try again.\n");
}
} while (count <= 0);
sum = askDecimals(sum, count);
avg = sum / count;
printInfo(count, name, sum, avg);
return 0;
}
1条答案
按热度按时间lymgl2op1#
这是我的节目单。我的老师说:* 因为
askDecimals
中的sum
变量是一个值参数(通过一个值传递),它不能向调用程序返回信息 *。事实上,
askDecimal
函数中的sum
参数变量是一个局部变量,它不能将任何内容传递回调用方,但是您的方法返回sum
的值,以便调用方更新自己的变量是可以的。这是处理链表的函数的一个非常常见的习惯用法,其中头指针可能需要更新。存在这种方法的替代方案,由于浮点算术精度有限,其可能产生或可能不产生相同的结果:
传递一个指向总数的指针:
将
main
中的调用更改为:返回总数:
将
main
中的调用更改为: