C语言 按值传递参数并将同一参数返回给调用函数

mnemlml8  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(101)

我在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;
}
lymgl2op

lymgl2op1#

这是我的节目单。我的老师说:* 因为askDecimals中的sum变量是一个值参数(通过一个值传递),它不能向调用程序返回信息 *。
事实上,askDecimal函数中的sum参数变量是一个局部变量,它不能将任何内容传递回调用方,但是您的方法返回sum的值,以便调用方更新自己的变量是可以的。这是处理链表的函数的一个非常常见的习惯用法,其中头指针可能需要更新。
存在这种方法的替代方案,由于浮点算术精度有限,其可能产生或可能不产生相同的结果:
传递一个指向总数的指针:

int askDecimals(float *sum, int count) {
    int c, i = 0;
    if (count) {
        for (i = 0; i < count; i++) {
            float decimal;
            printf("Enter a decimal number: ");
            if (scanf("%f", &decimal) != 1)
                break;
            *sum += decimal;
        }
        while ((c = getchar()) != EOF && c != '\n')
            continue;
    }
    return i;  // return the number of values read from `stdin`.
}

main中的调用更改为:

count = askDecimals(&sum, count);
    avg = sum / count;

返回总数:

float askDecimals(int count) {
    float sum = 0;
    if (count) {
        int c;
        for (int i = 0; i < count; i++) {
            float decimal;
            printf("Enter a decimal number: ");
            if (scanf("%f", &decimal) != 1)
                break;
            sum += decimal;
        }
        while ((c = getchar()) != EOF && c != '\n')
            continue;
    }
    return sum;
}

main中的调用更改为:

sum += askDecimals(count);  // assuming count values are read.
    avg = sum / count;

相关问题