C 如果类型与类型说明符不匹配,printf如何工作?

C 如果类型与类型说明符不匹配,printf如何工作?,c,printf,C,Printf,根据类型说明符,这里需要一个字符。但是我们正在传递它const char*。我希望它能在GNU GCC编译器的代码块中给我一条警告消息,但它并没有给我任何警告并打印$字符 为什么不提供任何类型的警告?使用printf()如果存在类型不匹配,则会导致未定义的行为 格式说明符应与要打印的类型匹配 此外,参数的数量应与违反格式说明符的数量相匹配,这也将导致未定义的行为 只需在编译代码时添加-Wall,您将得到以下错误: 警告:格式%c需要int类型,但参数2具有char类型* 使用printf()如果

根据类型说明符,这里需要一个字符。但是我们正在传递它
const char*
。我希望它能在GNU GCC编译器的代码块中给我一条警告消息,但它并没有给我任何警告并打印
$
字符

为什么不提供任何类型的警告?

使用
printf()
如果存在类型不匹配,则会导致未定义的行为

格式说明符应与要打印的类型匹配

此外,参数的数量应与违反格式说明符的数量相匹配,这也将导致未定义的行为

只需在编译代码时添加
-Wall
,您将得到以下错误:

警告:格式%c需要int类型,但参数2具有char类型*

使用
printf()
如果存在类型不匹配,则会导致未定义的行为

格式说明符应与要打印的类型匹配

此外,参数的数量应与违反格式说明符的数量相匹配,这也将导致未定义的行为

只需在编译代码时添加
-Wall
,您将得到以下错误:

警告:格式%c需要int类型,但参数2具有char类型*


您需要启用该警告

将您的代码编译为
test.cpp
,并在gcc 4.7.2下为
printf
添加带有正确警告标志的
#include

int main()
{
printf("%c", "\n");

return 0;
}

您需要启用该警告

将您的代码编译为
test.cpp
,并在gcc 4.7.2下为
printf
添加带有正确警告标志的
#include

int main()
{
printf("%c", "\n");

return 0;
}

您可以看到,该代码还可以与%d、%x、%u格式说明符一起使用

为什么它在没有任何警告的情况下工作?

因为您的代码块中没有启用警告

$ gcc -c -Wformat test.cpp
test.cpp: In function 'int main()':
test.cpp:5:18: warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat]
现在你得到:

Go to settings -> compiler and check

Enable All Common Compiler Warnings [-Wall]
为什么它还能工作?

对于%c,$是代码块中的输出,X是Visual Studio中的输出。所以,这听起来像是未定义的行为

无论如何,如果您希望第一个字符以这种方式显示,则只能执行以下操作:

In function 'int main()':
warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat=]|
#包括
int main()
{
printf(“%c”,*“Hello\n”);//没有问题,但仍然:)
返回0;
}

它通过取消引用常量指针来打印H。

您可以看到,该代码还可以与%d、%x、%u格式说明符一起使用

为什么它在没有任何警告的情况下工作?

因为您的代码块中没有启用警告

$ gcc -c -Wformat test.cpp
test.cpp: In function 'int main()':
test.cpp:5:18: warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat]
现在你得到:

Go to settings -> compiler and check

Enable All Common Compiler Warnings [-Wall]
为什么它还能工作?

对于%c,$是代码块中的输出,X是Visual Studio中的输出。所以,这听起来像是未定义的行为

无论如何,如果您希望第一个字符以这种方式显示,则只能执行以下操作:

In function 'int main()':
warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat=]|
#包括
int main()
{
printf(“%c”,*“Hello\n”);//没有问题,但仍然:)
返回0;
}

它通过取消引用常量指针来打印H。

您是否启用了编译器警告?我认为您的问题名称不正确;您会问为什么编译器没有发出警告,但标题表明您想知道如果
printf
接收到与其说明符不匹配的参数会发生什么情况。是否启用了编译器警告?我认为您的问题名称不正确;您会问为什么编译器没有发出警告,但标题表明您想知道如果
printf
接收到与其说明符不匹配的参数会发生什么情况。我想op可能知道这一点。他问为什么编译器没有给出警告。@MichaelWalz是的,关于OP是否知道printf是如何工作的,这个问题很容易引起误解,所以现在添加了这两个细节。我想OP已经知道了。他问为什么编译器没有给出警告。@MichaelWalz是的,关于OP是否知道printf是如何工作的,这个问题很容易让人误解,所以现在添加了两个细节
$是代码块中的输出,X是Visual Studio中的输出。
我认为编译器在这里不重要,如果启用了ASLR,它可能会在使用相同编译器的生成之间更改;)@szczurcio是的,它可以改变,但仍然是。无论如何,未定义的行为是否正确?
$是代码块中的输出,X是Visual Studio中的输出。
我认为编译器在这里并不重要,如果启用了ASLR,它可能在使用同一编译器的生成之间更改;)@szczurcio是的,它可以改变,但仍然是。总之,任何地方都有未定义的行为,对吗?