破釜沉舟论坛 » 编程开发 » 为什么函数不能直接调用另一函数???

2006-5-14 20:42 pop89099999
为什么函数不能直接调用另一函数???

  为什么函数不能直接调用另一函数???
比如:
int AAA(int a)
{
   return a-2;
}
int BBB(int c)              第一种情况
{   int a;
   return c+AAA(a);
}
-------------------------------------------
int AAA(int a)
{
   return a-2;
}
int a;                          第二种情况
int BBB(int c)
{
   return c+AAA(a);
}
系统告之:第一种情况:参数a没有使用。并且得不到“c+AAA(a)”的真实值。
         第二种情况:虽然没有错误和警告,但也得不到“c+AAA(a)”的真实值。
请高手帮忙。

2006-5-14 21:25 祥子
你的实参都初始化了吗?

2006-5-16 00:34 pop89099999
本人在此说清楚问题,本问题纯粹是:用户定义了两个调用函数,分别是AAA(a)与BBB(c)。在定义的过程中,先定义了AAA(a),后面定义BBB(c)的过程中怎么调用AAA(a)(也就是在BBB(c)的函数体中怎么调用AAA(a)).请各位高手指导。编译系统提出的错误只是表面问题,并不是根本问题

2006-5-16 10:13 thingi
你能把你的调用过程写出来,在什么编译器执行?
会提示你a没初始化,是因为不管第一还是第二种,你a始终没有赋值,在有的编译器会有默认值,那样编译不会出错,但结果不可预料;但有的编译器要求所有定义变量必须初始化,否则编译不能通过。(我在vc6.0作过测试,你那函数调用没什么问题,问题在于系统给默认值,导致结果不可预料。)
至于你的跟贴:函数调用就是那样子,你的写法并没有问题,也就是BBB(c)函数调用AAA(a)是完全可以的!!

2006-5-16 10:18 thingi
int AAA(int a)
{
  return a-2;
}
int BBB(int c)         第一种情况
{   int a;
  a=3;//多这个你看看
  return c+AAA(a);
}

2006-5-16 14:20 祥子
函数原型是没有问题的。

估计问题出在编译器。

C系列的就不是很清楚了,因为不同的C,版本不同,对变量的初始化也不相同。

Delphi里的整型变量都要初始化,不然就是一个随机数。

2006-5-16 22:54 pop89099999
本人通过thingi高手的赋值情况下的调用函数的提示,得出输入语句下的调用函数的程序供大家参考。同时也感谢thingi高手的指导。
程序如下:
#include <iostream>
using namespace std;
int aaa(int a)
{
    return a;
}
int bbb(int b)
{   int a;
    cin>>a;
    return b+aaa(a);
}
int main( )
{
     int b;
     cin>>b;
     cout<<bbb(b)<<endl;
     return 0;
}

版主说的内容不知何意,请教一下。

2006-5-16 23:46 祥子
我的意思就是你传入函数的实参没有初始化。

虽然有些编译器会自动把INT型的变量初始化为0,但是有的不会。

理由我在这里简单地说明一下:
INT型一般来说是32位,也就是在内存中分配4个字节的空间给变量。这就是预留。
有些编译器会把这4个字节的内容清除为:00 00
但是有的编译器不会清除,也就是内存里的值是多少就是多少(00 00 ~ FF FF)之间的一个数。

所以,如果编译器不自动初始化的话,你想想你引用一个未初始化的变量,会带来什么后果?
要养成良好的习惯,对变量赋初值。

2006-5-16 23:49 祥子
int aaa(int a)
{
  return a;
}

你的这个函数没有任何的作用,返回值没用对形参进行任何修改,调用此函数相当于直接使用变量

2006-5-17 18:16 pop89099999
谢谢祥子版主的说明

2006-5-25 08:26 workout
第一种情况下,变量a没有赋值,所以在定义BBB时,无法调用AAA。
第二种情况,定义的a是一个全局变量,而在 return c+AAA(a);时,注意!这是定义函数,而不是主程序中的调用,这个a应该是一个局部变量,优先级高于全局变量
我认为你可以这样修改
int BBB(int a,int c)
必须传递两个参数

2006-5-25 12:27 祥子
[quote][b]引用第10楼[i]workout[/i]于[i]2006-05-25 08:26[/i]发表的“”[/b]:
第一种情况下,变量a没有赋值,所以在定义BBB时,无法调用AAA。
第二种情况,定义的a是一个全局变量,而在 return c+AAA(a);时,注意!这是定义函数,而不是主程序中的调用,这个a应该是一个局部变量,优先级高于全局变量
我认为你可以这样修改
int BBB(int a,int c)
必须传递两个参数[/quote]

第一种情况:
没有赋值不代表不可以调用,因为在内存中他已经有值,只不过有可能是一个未知的值。

第二种情况:
也是同样的的原因,并不是局部变量与全局变量的原因。局部变量只有在与全局变量同名的时候,才会有优先级高于全局变量

2006-5-25 22:46 pop89099999
祥子大哥说的好,顶啊

2006-6-3 18:24 pixiou
int AAA(int a)
{
  return a-2;
}
int BBB(int c)         第一种情况
{   int a;
  return c+AAA(a);
}
//////////////////////////////////////我觉得应该是:
int AAA(int a)
{
  return a-2;
}
int BBB(int c)         第一种情况
{   int a;int b;
b = AAA(a);
c= c + b;
  return c;
}

2006-6-3 22:29 祥子
[quote][b]引用第13楼[i]pixiou[/i]于[i]2006-06-03 18:24[/i]发表的“”[/b]:
int AAA(int a)
{
  return a-2;
}
int BBB(int c)         第一种情况
.......[/quote]


说了很多次了,不同的编译器。对变量的初始化不相同。

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.