请解释下面printfs的区别
Please explain the difference in the printfs below
printf("%x\n",(const uint8_t *)0x0D);
printf("%x\n",(const uint8_t)0x0D);
printf("%x\n",(uint8_t *)0x0D);
printf("%x\n",0x0D);
他们都给我D
。这里的const
和*
有什么意义?
%x
格式说明符专家参数类型为 unsigned int
.
在你的情况下,
printf("%x\n",(const uint8_t)0x0D);
printf("%x\n",0x0D);
参数将被提升(默认提升规则)以匹配类型,但在
的情况下
printf("%x\n",(const uint8_t *)0x0D); //supplying a pointer
printf("%x\n",(uint8_t *)0x0D); //supplying a pointer
您将根据 C11
章节 §7.21.6.1
调用 undefined behavior
[...] If any argument is
not the correct type for the corresponding conversion specification, the behavior is
undefined. [...]
%x
指定 printf
用于将无符号整数参数打印为十六进制表示法。这就是为什么你看到所有打印 'D'。但是只有第4种形式是正确的。
printf("%x\n",(const uint8_t *)0x0D); // undefined behavior, converting integer constant to a pointer
printf("%x\n",(const uint8_t)0x0D); // ok, but not necessary
printf("%x\n",(uint8_t *)0x0D); // undefined behavior
printf("%x\n",0x0D); // ok
注意该函数在任何情况下都不需要常量,所以 const
根本没用,注意 C 中的 const
不会生成常量,它只将某些东西定义为只读。
printf("%x\n",(const uint8_t *)0x0D);
printf("%x\n",(const uint8_t)0x0D);
printf("%x\n",(uint8_t *)0x0D);
printf("%x\n",0x0D);
他们都给我D
。这里的const
和*
有什么意义?
%x
格式说明符专家参数类型为 unsigned int
.
在你的情况下,
printf("%x\n",(const uint8_t)0x0D);
printf("%x\n",0x0D);
参数将被提升(默认提升规则)以匹配类型,但在
的情况下 printf("%x\n",(const uint8_t *)0x0D); //supplying a pointer
printf("%x\n",(uint8_t *)0x0D); //supplying a pointer
您将根据 C11
章节 §7.21.6.1
[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined. [...]
%x
指定 printf
用于将无符号整数参数打印为十六进制表示法。这就是为什么你看到所有打印 'D'。但是只有第4种形式是正确的。
printf("%x\n",(const uint8_t *)0x0D); // undefined behavior, converting integer constant to a pointer
printf("%x\n",(const uint8_t)0x0D); // ok, but not necessary
printf("%x\n",(uint8_t *)0x0D); // undefined behavior
printf("%x\n",0x0D); // ok
注意该函数在任何情况下都不需要常量,所以 const
根本没用,注意 C 中的 const
不会生成常量,它只将某些东西定义为只读。