C编译器警告错误

cyk*_*ath 0 c

一个简单的程序

#include<stdio.h>
int main() {
char b='a';
printf("%s \n", b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

test.c: In function ‘main’:
test.c:4:1: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
 printf("%s \n", b);
 ^
Run Code Online (Sandbox Code Playgroud)

但第二个arg char不是int.

这是编译器的错误警告,还是我遗漏的其他东西?

Kei*_*son 5

编译器肯定是正确的警告呼叫.printf使用"%s"说明符需要一个类型的参数char*(必须指向一个字符串),并且您传递的参数不是该类型的参数.

至于警告信息引用的原因int而不是char,因为它printf是一个可变函数.第一个参数(格式字符串)声明为类型const char*,但以下参数仅指定为, ....在这种特殊情况下,整数类型窄的参数比int提升intunsigned int.因此,即使表达式b是类型char,传递给的实际参数printf也是类型int; 具体地,它的转换的值的结果b,从charint.