关于函数返回值问题
如下#include <stdio.h>
int main(void)
{
double test(int v);
int a={1,2,3,4,-1,-2,-3,-4,2,3};
int i;
for(i=0;i<10;i++)
{
test(a);
printf("%d\n",a);
}
}
double test(int v)
{
v=v>0?v:0;
}
如果printf在主函数里,这个test像是没执行或者没返回值,值没储存一样。负数输出的还是负数。
但是如果把它放在test函数里,他就能负数输出0.
这到底是个什么道理,执行主函数test的时候是没有执行?为什么a小于0返回值还是a【i】呢 本帖最后由 zltzlt 于 2020-1-4 19:07 编辑
v=v>0?v:0; 是覆盖了参数 v,不会改变参数 v。楼主可以试试这样:
#include <stdio.h>
int main(void)
{
int a = {1, 2, 3, 4, -1, -2, -3, -4, 2, 3};
int i;
for (i = 0; i < 10; i++)
{
a = test(a);
printf("%d\n", a);
}
}
int test(int v)
{
return v > 0 ? v : 0;
} zltzlt 发表于 2020-1-4 19:05
v=v>0?v:0; 是覆盖了参数 v,不会改变参数 v。楼主可以试试这样:
。。牛逼,但是对覆盖不太理解。。。覆盖跟改变有什么区别。。为什么覆盖了之后输出的值是被覆盖的,而不是覆盖的呢。就比如如果i=0;i=1。 那为什么这时候输出的就是1呢 wangzezhong 发表于 2020-1-4 19:15
。。牛逼,但是对覆盖不太理解。。。覆盖跟改变有什么区别。。为什么覆盖了之后输出的值是被覆盖的,而不 ...
v=v>0?v:0 相当于创建了新变量 v,只是新变量与旧变量重名了,所以新变量覆盖了旧变量。 zltzlt 发表于 2020-1-4 19:18
v=v>0?v:0 相当于创建了新变量 v,只是新变量与旧变量重名了,所以新变量覆盖了旧变量。
搜了一下懂了点,,C语言变量还能重名,谢了兄弟 。。。。楼上的解释不太对把。。。。。
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
页:
[1]