鱼C论坛

 找回密码
 立即注册
查看: 1247|回复: 5

[已解决]关于函数返回值问题

[复制链接]
发表于 2020-1-4 19:00:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如下
#include <stdio.h>
int main(void)
{
        double test(int v);
        int a[10]={1,2,3,4,-1,-2,-3,-4,2,3};
        int i;
        for(i=0;i<10;i++)
        {
                test(a[i]);
                printf("%d\n",a[i]);
        }
}
double test(int v)
{
        v=v>0?v:0;
}


如果printf在主函数里,这个test像是没执行或者没返回值,值没储存一样。负数输出的还是负数。
但是如果把它放在test函数里,他就能负数输出0.

这到底是个什么道理,执行主函数test的时候是没有执行?为什么a[i]小于0返回值还是a【i】呢
最佳答案
2020-1-4 19:05:50
本帖最后由 zltzlt 于 2020-1-4 19:07 编辑

v=v>0?v:0; 是覆盖了参数 v,不会改变参数 v。楼主可以试试这样:
#include <stdio.h>
int main(void)
{
        int a[10] = {1, 2, 3, 4, -1, -2, -3, -4, 2, 3};
        int i;
        for (i = 0; i < 10; i++)
        {
                a[i] = test(a[i]);
                printf("%d\n", a[i]);
        }
}
int test(int v)
{
        return v > 0 ? v : 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-4 19:05:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zltzlt 于 2020-1-4 19:07 编辑

v=v>0?v:0; 是覆盖了参数 v,不会改变参数 v。楼主可以试试这样:
#include <stdio.h>
int main(void)
{
        int a[10] = {1, 2, 3, 4, -1, -2, -3, -4, 2, 3};
        int i;
        for (i = 0; i < 10; i++)
        {
                a[i] = test(a[i]);
                printf("%d\n", a[i]);
        }
}
int test(int v)
{
        return v > 0 ? v : 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-1-4 19:15:40 | 显示全部楼层
zltzlt 发表于 2020-1-4 19:05
v=v>0?v:0; 是覆盖了参数 v,不会改变参数 v。楼主可以试试这样:

。。牛逼,但是对覆盖不太理解。。。覆盖跟改变有什么区别。。为什么覆盖了之后输出的值是被覆盖的,而不是覆盖的呢。就比如如果i=0;i=1。 那为什么这时候输出的就是1呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-4 19:18:32 | 显示全部楼层
wangzezhong 发表于 2020-1-4 19:15
。。牛逼,但是对覆盖不太理解。。。覆盖跟改变有什么区别。。为什么覆盖了之后输出的值是被覆盖的,而不 ...

v=v>0?v:0 相当于创建了新变量 v,只是新变量与旧变量重名了,所以新变量覆盖了旧变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-1-4 19:36:00 | 显示全部楼层
zltzlt 发表于 2020-1-4 19:18
v=v>0?v:0 相当于创建了新变量 v,只是新变量与旧变量重名了,所以新变量覆盖了旧变量。

搜了一下懂了点,,C语言变量还能重名,谢了兄弟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-4 21:38:40 | 显示全部楼层
。。。。楼上的解释不太对把。。。。。

C语言和python不一样,C的所有形参都是按值传递的;

换句话说,你函数内部的形参只是外部传递的实参的复制,改变形参不会影响实参的值。

这跟重名无关,跟覆盖更没有关系。

#include <stdio.h> 

void func(int x) {
        x = x + 1;
        printf("x的值为%d\n", x);
}


int main() {
        int a = 5;
        func(a);
        printf("a的值为%d\n", a);
}
输出
x的值为6
a的值为5

如果想要函数内部的改变影响到实参,只能绕一步路,使用指针:
#include <stdio.h> 

void func(int* x) {
        *x = *x + 1;
        printf("x的值为%d\n", *x);
}


int main() {
        int a = 5;
        func(&a);
        printf("a的值为%d\n", a);
}

输出:
x的值为6
a的值为6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 05:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表