2017-06-20 35 views
0
#include <stdio.h> 

    int main(void) 
    { 

     int i=10; 
     printf("%p",i); 
     return 0; 
    } 

输出: -林困惑关于%P符

0xa 

%P - 我读%P是用来打印在printf的指针,但在这里我是一个整数,也没有指针声明如何“0xa”得到输出。

+0

输入错误,输出错误。一般来说,'printf'只打印你输入的内容。在这里你把一个整数,并打印这个整数。由于'%p'不是适用于整数的格式说明符,因此您也有未定义的行为 – Gerhardh

+0

顺便说一句,恕我直言,问题没有错。写得很好,也是一个可编辑的例子。 – Bathsheba

回答

4

您的代码的行为是undefined,因为%p不适用于int类型的适当格式说明符。

允许编译器做任何东西,其中包括优化您的代码到int main(){}

2

从技术上讲,这是未定义的行为,因为%pint的错误格式说明符。

但是,如果你的平台是32位,然后%p通常归结为印刷在大多数实现十六进制所提供的值,因此printf("%p", 10);通常会打印在这些实现0xA0x0000000A

无论如何,不​​要使用不匹配的格式说明符,因为即使它看起来工作,它也会导致undefined behaviour

+0

合理化UB是一种危险的艺术。恕我直言,需要在这里采取更多的照顾。例如。 int可能是32位平台上的16位。然后怎样呢?但是你确实描述了输出,所以或许你的回答比我的更有帮助。有一个upvote。 – Bathsheba

+0

@Bathsheba是'int'可能是16位,但我不知道这样的实现。但无论如何,我写了_usually_。 –

+0

我们的老朋友Turbo C++有16位整数,许多学校似乎都使用它。 – Bathsheba