在 printf 函数中使用 "%d" + 常量
Using the "%d" + constant in the printf function
#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);
}
以下程序的输出是:
1天[=11=]
谁能解释一下为什么?
在编码 "literalstring" + 3
时,您得到第 4th(因为 4 = 3+1 并且数组索引从 0 开始)和 [=11= 的后续字节] (以零字节结尾)所以你得到 "eralstring"
,因此
"%d" + 0
是 "%d"
"%d" + 1
是 "d"
,请注意 printf("d", 1)
忽略 参数 1!
"%d" + 2
是 ""
一个空字符串
"%d" + 3
指向一个未定义的位置并取消引用它(就像 printf
可能那样)是 undefined behavior ...
printf("%d" + 0 , c);
与
相同
printf("%d", c);
打印 c
的值,即 1.
printf("%d" + 1 , c)
与
相同
printf("d", c)
在屏幕上打印 "d"。 lthird printf
类似于
printf("", c)
什么都不打印,最后一个调用 UB(Undefined Bahaviour)
您正在将指针移动到传递给 printf
的 "%d"
,因此
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("%d" + 3, c)
此处 printf 将获取指向缓冲区的地址,即 未定义行为.
最后
1d
已打印。
您的程序可能在 printf("%d" + 3, c)
接收到分段错误信号,如果 stdout
在分段错误之前刷新,则 1d
仍将打印。
对于下面的这个,您将得到
的输出
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
所以它正在从给定的字符串中获取字符。
#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);
}
以下程序的输出是:
1天[=11=]
谁能解释一下为什么?
在编码 "literalstring" + 3
时,您得到第 4th(因为 4 = 3+1 并且数组索引从 0 开始)和 [=11= 的后续字节] (以零字节结尾)所以你得到 "eralstring"
,因此
"%d" + 0
是"%d"
"%d" + 1
是"d"
,请注意printf("d", 1)
忽略 参数 1!"%d" + 2
是""
一个空字符串"%d" + 3
指向一个未定义的位置并取消引用它(就像printf
可能那样)是 undefined behavior ...
printf("%d" + 0 , c);
与
相同printf("%d", c);
打印 c
的值,即 1.
printf("%d" + 1 , c)
与
相同printf("d", c)
在屏幕上打印 "d"。 lthird printf
类似于
printf("", c)
什么都不打印,最后一个调用 UB(Undefined Bahaviour)
您正在将指针移动到传递给 printf
的 "%d"
,因此
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("%d" + 3, c)
此处 printf 将获取指向缓冲区的地址,即 未定义行为.
最后
1d
已打印。
您的程序可能在 printf("%d" + 3, c)
接收到分段错误信号,如果 stdout
在分段错误之前刷新,则 1d
仍将打印。
对于下面的这个,您将得到
的输出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
所以它正在从给定的字符串中获取字符。