1. c语言选择题,求大神帮忙解答,为什么输出结果不确定请给出具体解析。
fun(2,3,c);中的c是函数fun中的局部变量,与int c;中的c不是同一个变量,当fun函数结束后,fun(2,3,c);中的c将会被编译器销毁,后面的printf语句其实是输出的int c;中的c的值,而语句int c;是声明了int型变量,但是没有给它赋值,所以它的值是不确定的(垃圾值)
2. 急!请高手指教c++如何定义一个参数个数不确定的函数
VA_LIST是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数。
VA_LIST的用法:
首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
然后用VA_START宏初始化刚定义的VA_LIST变量;
然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
最后用VA_END宏结束可变参数的获取。
以下是一个定义一个参数个数不确定的函数的简单例子:
#include<cstdarg>
#include<iostream>
usingnamespacestd;
doubleaverage(intnum,...)
{
va_listarguments;//
doublesum=0;
va_start(arguments,num);//
for(intx=0;x<num;x++)//Loopuntilallnumbersareadded
sum+=va_arg(arguments,double);//.
va_end(arguments);//Cleansupthelist
returnsum/num;//Returnssomenumber(typecastpreventstruncation)
}
intmain()
{
cout<<average(3,12.2,22.3,4.5)<<endl;
cout<<average(5,3.3,2.2,1.1,5.5,3.3)<<endl;
}
3. C语言输出不确定值为什么
你把a[j]=j[i]+1;改成a[j]=a[i]+1;
把printf("%d\n",a[2]);改成printf("%d\n",a[1]);就行了
越界了。你定义的int a[2];它的下标是从0开始的,即只有a[0],a[1],没有a[2],你最后的输出出错了
4. c语言中的空函数返回一个不确定的值的意思是返回的数据的数据类型不确定还是返回的数据没有确定的值
返回的数据是个不确定的值,原因是:
1、你定义函数fun()前面加void或者不加时,默认是无返回值,或者也说返回了一个垃圾数据
2、而这个垃圾数据通常都是固定的一串整形的数据,因为这是编译器编译时释放函数没有返回值,所以系统随机返回的一个垃圾值,而往往你输出验证时就是差不多大小一个整形数据。
3、也有人理解无返回值,这只是一种理解和解释编译器规则的想法。
如果满意,请采纳!
5. 用汇编解释C语言中printf的参数为什么是不确定的,如何实现的
//32 bit 汇编调用printf
//call printf (fmt,a1,a1,a3,a4.....an)
;调用的数据压入栈,由于宽度不知道,所以用伪代码表示.
push a5
push a4
push a3
push a2
push a1
push offset fmt
call printf
sub esp,sizeof(an)+..........+sizeof(a4)+sizeof(a3)+sizeof(a2)+sizeof(a1)
printf 的C实现
//实际上 用汇编的时候,跳过返回地址就是所有参数的首地址
//mov ebx ,DWORD PTR esp[8] ; //fmt 的地址
//mov esi, DOWRD ptr esp[12] //a1的地址
char**pVarList= &fmt;//fmt 在堆栈最低端。是个地址,所以他的地址就是所有参数的首地址
pVarList++;
for( i=0;i<strlen(fmt);i++)
{
if(*p='%'){
split(&p,w0,w1,s,f)
//p格式的下一个字符,s所代表w0,w1 %8.2f w0=8w1=2 +号-号, case 'U','u'里的 ‘U’,'u'
switch(f)
{
case 'U','u':如果 是%8U %u %-8 U f=U
unsigned int *pU=(unsigned int*)pVarList;
putUint(*pU,w0,s);所代表 +号-号
pU++;
pVarList=pU;
break;
case 'F','f':....
.{
unsigned int *pF=(unsigned int*)pVarList;
putFloat(*pF,w0,w1,s);
pU++;
pVarList=pF;
}
break;
case ......
break;
}
}
else if(*p=='\')
dealbackslash(&p);//同样 p指向\格式的最后一个字符的
else putc(*p++);
}
//32 bit
//call printf (fmt,a1,a1,a3,a4,a5)
push a5
push a4
push a3
push a2
push a1
push offset fmt
call printf
sub esp,sizeof(a5)+sizeof(a4)+sizeof(a3)+sizeof(a2)+sizeof(a1)
//16bit
//call printf (fmt,a1,a1,a3,a4,a5)
push a5
push a4
push a3
push a2
push a1
push offset fmt
call printf
sub sp,sizeof(a5)+sizeof(a4)+sizeof(a3)+sizeof(a2)+sizeof(a1)
6. c语言函数定义时,可变参数类型已定,个数不定,应该怎么做
这个错误是你声明的某些变量占用空间太大,没可用的空间,就会占用操作系统内存空间,建议你别声明三维数组
7. C语言中如何将结构体作为参数,结构体的数量不确定
如果你能计算数量,可以这样
fun(struct S * array, int count)
如果不能,则需要在array最后放一个空指针
8. c语言一个函数返回多个值
在C语言中,一般情况下函数的返回值是通过函数中的return语句来实现的,每调用一次return语句只能从函数中返回一个值。但在实际很多应用中,我们需要从函数中返回多个值,那我们可以用什么方法实现呢?此时我们可以用三种方法来实现。
方法一:设置全局变量
全局变量是在函数外部定义的全局变量,它不属于任何一个函数,其作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。当我们需要函数返回多个值时,除了函数体中的return语句返回其中一个之外,其它的返回值我们可以通过定义全局变量来处理。因为根据全局变量的特点,在被调用函数中改变了多个全局变量和值,相当于其主调函数全局变量的值也发生了变化,也就相当于返回了多个值。
例如:利用一个函数求出正方形的周长和面积。
#include
double l=0;//定义全局变量l为正方形周长
void f(double a)//定义求面积和周长的函数
{ double s; s=a*a;//求面积
l=6*a;//求周长,并赋给全局变量l
return s;//仅返回面积的值
}
void main()
{ double a,area;
printf(“请输入边长:");
scanf("%f",&a);
area=f(a);//面积的值通过调用f函数返回值
printf(“面积为:%5.2lf\n”,area);
printf(“周长为:%5.2lf\n”,l);//周长即为全局变量l在f函数中改变后的值
}
上面的例子即用全局变量实现了函数中返回多值的情况,这种方式易懂。但是全局变量用多了会破坏代码的安全性,结构性,这主要是全局变量在所有函数中都可以使用,从而其值的变化不确定,所以我们要慎用。
方法二:使用数组名或指针作为函数的形参
数组名或者指针实际为地址,而数组一般都包括多个元素,指针也可以指向一组数据的着地址,把数组名或者指针作为函数形参,实际上相当于主调函数的实参与形参共用地址,所以在函数中的数组元素发生改变即是实参也随之改变。也相当于在调用函数时多个值返回给主调函数。
实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。
方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。程序参考代码如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定义求数组最大值最小值的函数,传递数组指针*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用于交换位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr<*(ptr+i))/*最大值与第一个元素进行交换*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值与最后一个元素进行交换*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*调用最大最小值函数*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
调试结果如下:
请输入6个整形数,以空格隔开:
5 8 9 32 -6 4
max=32,min=-6
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。
方法三:使用结构体指针作为函数的形参
编写返回多个值的C语言函数,可以考虑采用结构体的方式去实现。如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。
实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。参考代码如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定义学生结构体,分别包含成员学号、姓名、班别、总评成绩*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定义学生结构体类型变量*/
void xxxx(struct inf *ptr);
printf("请输入学号,姓名,班别,总评成绩,以空格隔开:\n") ;
xxxx(&a1);/*调用函数,以学生结构体类型变量地址作为实参*/
printf("学号:%s,姓名: %s,班别:%s,总评成绩:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*该函数实现对结构体成员数据的录入操作*/
{
char xh1[12],name1[20],class1[15];
int chj1;
scanf("%s%s%s%d",xh1,name1,class1,&chj1);
strcpy(ptr->xh,xh1);
strcpy(ptr->name,name1);
strcpy(ptr->class,class1);
ptr->chj=chj1;
}
调试结果如下:
请输入学号,姓名,班别,总评成绩,以空格隔开:
200102LiLi200185
学号:200102,姓名: LiLi,班别:2001,总评成绩:85
注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。
结束语
对于以上这三种方法,如果想要返回的数个值数据类型一致,可以考虑采用方法2;而对于不同数据类型的返回值,如果各个数值之间是相互联系的,则方法3较为合适;方法1虽然在很多情况下都可以实现多个返回值的C语言函数,但毕竟全局变量应用过程中有很多危险,要慎重使用。
通过对以上几种方法的分析讲解,在教学过程中,学生再遇到这样的问题时,就能根据返回值的情况选择合适的途径去实现多个返回值的C语言函数。另外,如果再遇到类似的无法用教材知识点去直接解决的问题时,他们基本都能举一反三地尝试采用间接方式去解决。
参考材料:http://blog.csdn.net/supreme42/article/details/7636475
http://wenku..com/link?url=
9. 在C语言中,若调用一个函数,且此函数没有return值,该函数返回一个不确定的值,这句话对吗
对的,C语言中函数句柄(指针)指向一个地址,如果该函数没有Return,那么函数句柄就没有被赋值,会返回句柄指向内存的值,表现出一个随机的数。
10. 请问c语言编写函数时不确定 参数数量时该怎么办
在函数定义的时候就必须写形参名了。声明的时候不需要,因为编译器还用不到,只要知道相应位置是个啥类型的就行了