C 字符是否作为整数传递给被调用函数?
我在下面编写了一个C程序来调用参数数目可变的函数C 字符是否作为整数传递给被调用函数?,c,gcc,integer,character,variadic-functions,C,Gcc,Integer,Character,Variadic Functions,我在下面编写了一个C程序来调用参数数目可变的函数 #include<stdio.h> #include<stdarg.h> void display(int, int, ...); int main() { display(1,5,1,2,3,4,5); display(2,3,'A','B','C'); printf("\n"); return 0; } void display(int type, int tot_num, ...
#include<stdio.h>
#include<stdarg.h>
void display(int, int, ...);
int main()
{
display(1,5,1,2,3,4,5);
display(2,3,'A','B','C');
printf("\n");
return 0;
}
void display(int type, int tot_num, ...)
{
int i, j;
char c;
va_list ptr;
va_start (ptr, tot_num);
switch(type)
{
case 1:
for (j=0; j<tot_num; j++)
{
i = va_arg (ptr, int);
printf("%d ",i);
}
break;
case 2:
for (j=0; j<tot_num; j++)
{
c = va_arg(ptr, char);
printf("%c ",c);
}
}
}
第41行是c=va_arg(ptr,char)代码>
当我阅读va_arg的man 3页面时,它被提到如下:
如果没有下一个参数,或者如果类型与实际下一个参数的类型不兼容(根据默认参数升级进行升级),则会发生随机错误
当我读到这篇文章时,我想c=va_arg(ptr,char)代码>是正确的,因为变量参数列表中的数据是个字符。然而,gcc发出的上述警告表明,传递的变量参数实际上不是字符,而是整数
根据gcc的建议,我将其更改为c=va_arg(ptr,int)代码>,现在我没有收到任何警告。当我运行程序时,我也得到了预期的输出
那么,字符(第二次调用main()
中的diplay()
)是否作为整数传递给display()
谢谢 是'A'
的类型是int
,请尝试以下操作
printf("typeof('A') == typeof(int) -> %s\n",
(sizeof('A') == sizeof(int)) ? "YES" : "NO");
自己检查一下
编辑:
根据的评论,即使您这样做,也会发出警告
char a = 'A';
然后传递a
,因为它无论如何都会被提升到int
,所以它的意思是
int arg = va_arg(ptr, int);
始终正确,注释中提到的标准部分说明如下
§6.5.2.2
7。如果表示被调用函数的表达式具有包含原型的类型,
参数被隐式地转换为
对应参数,取各参数类型为不合格版本
属于其声明的类型。函数原型声明器中的省略号表示法导致
参数类型转换在最后声明的参数之后停止。默认参数
对尾部参数执行升级
#include<stdio.h>
#include<stdarg.h>
void display(int, int, ...);
int main()
{
display(1,5,1,2,3,4,5);
display(2,3,'A','B','C');
printf("\n");
return 0;
}
void display(int type, int tot_num, ...)
{
int i, j;
char c;
va_list ptr;
va_start (ptr, tot_num);
switch(type)
{
case 1:
for (j=0; j<tot_num; j++)
{
i = va_arg (ptr, int);
printf("%d ",i);
}
break;
case 2:
for (j=0; j<tot_num; j++)
{
c = va_arg(ptr, char);
printf("%c ",c);
}
}
}
据我回忆,字符(您正在传递的)实际上是以int类型存储在C中的。如果这是错误的,我相信有人会纠正我。是的,'A'
是一个int
。另外,@LeeDanielCrocker感谢您的链接。但是即使额外的参数是chara='a'代码>和显示(2,3,a,a,a)
,由于默认参数提升(6.5.2.2函数调用,C11标准第7段),值将作为int
传递,而不是char
。@iharob yea检查了它。但在那之后,我有一个问题,比如,“如果我将一个字符传递给一个函数,并将其存储在被调用函数中的一个字符变量中,怎么可能呢?int需要4个字节?char有1个字节?”但我再次想,“等等,字符有1个字节,所以它们最多只能取2(pow)的值8-1,如果我传递一个等于或小于2(pow)8-1的整数,那么我当然可以将它存储在一个char变量中。“我的理解正确吗?@1Byn是的,正确。如果传递的值较大,则会出现问题。但只要值只需要1字节,就不会有问题。