论坛风格切换切换到宽版
  • 4192阅读
  • 14回复

再请教朋友们一个C的问题 [复制链接]

上一主题 下一主题
离线BA5RW
 
发帖
48263
只看楼主 倒序阅读 0楼 发表于: 2007-12-19
因为老眼昏花,不知道该在厚厚的书中找哪一页,在此求教各位,谢谢先了!
问题:
我写两个函数,顺序如下:
void a()
{ uint a;  
  a=1+2;
}

void main()
{ uint a;
  a();
  b=a+1;
}  

main中b=a+1中的a,是不是A函数运行的结果a=3?
我弄来弄去就是不能等于A中的a?就是b结果不会等于4!是不是我对数据的运算传递理解有问题?

谢谢了!
离线bigmon
发帖
1526
只看该作者 1楼 发表于: 2007-12-19
'
因为老眼昏花,不知道该在厚厚的书中找哪一页,在此求教各位,谢谢先了!
问题:
我写两个函数,顺序如下:
void a()
{ uint a;  
  a=1+2;
}
void main()
{ uint a;
  a();
  b=a+1;
}  
main中b=a+1中的a,是不是A函数运行的结果a=3?
我弄来弄去就是不能等于A中的a?就是b结果不会等于4!是不是我对数据的运算传递理解有问题?
谢谢了!
'

局部变量和全局变量的问题。

另外,void a();是没有返回值的。
在main()中,a没有赋值,就参加运算,b没有定义类型,问题多多。
离线BA5RW
发帖
48263
只看该作者 2楼 发表于: 2007-12-19
'
局部变量和全局变量的问题。
另外,void a();是没有返回值的。
在main()中,a没有赋值,就参加运算,b没有定义类型,问题多多。
'
是不是改:
void a()
{ uint a;
a=1+2;
return a
}

void main()
{ uint a,b;
a=a();
b=a+1;
}
就可以了?谢谢啊!
离线xidongs
发帖
149
只看该作者 3楼 发表于: 2007-12-19
'
是不是改:
void a()
{ uint a;
a=1+2;
return a
}
void main()
{ uint a,b;
a=a();
b=a+1;
}
就可以了?谢谢啊!
'


你的这个思路是对的,但是函数写的有问题。
对这个问题,我们慢慢来分析。

在1楼的帖子:很明显得不到你想要的值,因为函数a()
中的a在函数结束后消失,而b=a+1;
中的a的应用前并没有先赋值,所以得到的是随机的结果,好的编译器可以查出你应用前没有赋值,c++的编译器应该普遍都可以。



至于上面引用中的程序:你的思路是对的。但是这句话
void a()

说明了函数没有返回值,而你在最后有使用了 return a; 所以通常编译器仍然会报错。

但总的来说,思路是对了。
这是典型的变量作用域问题。

uint a,b;
可以认为b是定义了类型的。
离线Apple
发帖
759
只看该作者 4楼 发表于: 2007-12-19
你要恶补一下c语言.要达到你的目的可以这样写.
a作为全局变量.
uint a;
void a()
{
a=1+2;
}

void main()
{
uint b;
a();
b=a+1;
}
离线BA5RW
发帖
48263
只看该作者 5楼 发表于: 2007-12-19
'
你要恶补一下c语言.要达到你的目的可以这样写.
a作为全局变量.
uint a;
void a()
{
a=1+2;
}
void main()
{
uint b;
a();
b=a+1;
}
'
这种写法我也试过,不知道是哪儿出错,也得不到结果,现在我知道自己要去了解作用域的知识了,谢谢同志们!实在太感谢了!
在线BG4UVR
发帖
11288
只看该作者 6楼 发表于: 2007-12-19
4楼是老师,论点正确。5楼应该加强学习。
在线BG4UVR
发帖
11288
只看该作者 7楼 发表于: 2007-12-19
正确答案闪亮登场,palapala...

usngined char a(void)
{
    return(1+2);
}
void main()
{
    uint b;
    b=a()+1;
}
离线BA5RW
发帖
48263
只看该作者 8楼 发表于: 2007-12-19
'
正确答案闪亮登场,palapala...
usngined char a(void)
{
return(1+2);
}
void main()
{
uint b;
b=a()+1;
}
'
但是我的a实际上是要模仿一段可选数值的获取程序
uint a(uchar x)
{ uint a;
a=x+1;
return a;
}

void main()
{unit b,c;
c=a(3); //x按需要填数值
b=c+2;

}
结果b=6,运算测试通过了!哈!还不是很清楚过程,特别是我return的是a,怎么成了A(3)的整个结果?希望继续指点!
可能会叫我去看书,可是^!@#$,希望理解!谢谢!
离线Apple
发帖
759
只看该作者 9楼 发表于: 2007-12-19
'
4楼是老师,论点正确。5楼应该加强学习。
'
我错哪里了?
明示一下,我还真没明白.
我也要看看书.
离线Apple
发帖
759
只看该作者 10楼 发表于: 2007-12-19
我给你写上注释,看你能不能明白

//函数a,取得x的运算结果
// 返回值:运算结果
// 参数: 自变量x
uint a(uchar x)
{
uint a; //声明a为uint型
a=x+1;//运算,a=x+1
return a;//返回a的值作为函数返回值
}

//主函数
void main()
{unit b,c;//变量声明
c=a(3); //将3作为参数传给函数a,函数a返回值赋值给c
b=c+2;//c+2赋值给b
}
>>还不是很清楚过程,特别是我return的是a,怎么成了A(3)的整个结果?
这个说起来复杂,简单说可以理解成return语句就可以把返回值带回,作为函数a的执行结果。
复杂说我说不了,要整理一下才能说。
离线bigmon
发帖
1526
只看该作者 11楼 发表于: 2007-12-19
uchar x
uint a
类型不匹配,编译器能强制转换?
离线BA5RW
发帖
48263
只看该作者 12楼 发表于: 2007-12-20
'
uchar x
uint a
类型不匹配,编译器能强制转换?
'
可能是我输入错误,但也有可能会自动归类.改天试试看.
也感谢以上朋友的注释,我会继续学习看看.
现在能用C解决实际问题了,但是基本上是一知半解摸索中前进!
在线BG4UVR
发帖
11288
只看该作者 13楼 发表于: 2007-12-20
'
我错哪里了?
明示一下,我还真没明白.
我也要看看书.
'

我也看了一下,似乎也没错误,大概昨天喝了酒看错了 :d

不过你的代码多用了内存是真的 :d
离线Apple
发帖
759
只看该作者 14楼 发表于: 2007-12-20
我没考虑内存的事情,虽然知道周老师是在51上用c语言。
搂主自己现在也别在意内存什么的,等你遇到实际的内存问题在考虑,
现在只要编出能跑的程序就ok。