#include<stdio.h>
#include<stdlib.h>
void main()
{
int c = 1;
printf("%d" + 0 , c);
printf("%d" + 1 , c);
printf("%d" + 2 , c);
printf("%d" + 3 , c);
}
以下程序的输出是:
1D
任何人都可以解释原因吗?
答案 0 :(得分:3)
编码"literalstring" + 3
时,得到4 th (因为4 = 3 + 1,数组索引从0开始)和"literalstring"
的后续字节(终止通过零字节)所以你得到"eralstring"
,因此
"%d" + 0
是"%d"
"%d" + 1
为"d"
,请注意printf("d", 1)
忽略参数1!"%d" + 2
是""
一个空字符串"%d" + 3
指向未定义的位置并取消引用它(如printf
可能做的那样)是undefined behavior ... 答案 1 :(得分:2)
对于下面这个,您将获得输出
printf("%d\n" + 0 , c); -> 1 // +0 so Value of c will came
printf("%d\n" + 1 ,c); -> d // +1 "d" will print.
printf("%da\n" + 2 , c); -> a // +2 second character "a" will print
printf("%dab\n" + 3 , c);-> b // +3 third character "b" will print
所以它从给定的字符串中获取字符。
答案 2 :(得分:1)
printf("%d" + 0 , c);
与
相同printf("%d", c);
打印c
的值,即1。
printf("%d" + 1 , c)
与
相同printf("d", c)
打印&#34; d&#34;屏幕上。第四个printf
类似于
printf("", c)
不打印任何内容,最后一个调用UB(Undefined Bahaviour)
答案 3 :(得分:1)
您正在将指针移动到传递给"%d"
的{{1}}
printf
printf("%d" + 0, c)
printf("%d", c);
/* prints the value of c */
printf("%d" + 1, c)
printf("d", c);
/* prints 'd' */
printf("%d" + 2, c)
printf("", c);
/* the format string is empty nothing printed */
这里printf会得到一个指向缓冲区的地址,即未定义的行为。
最后
printf("%d" + 3, c)
打印。
您的程序可能会在1d
收到分段错误信号,但如果在分段错误之前刷新printf("%d" + 3, c)
,则仍会打印1d
。