在 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",因此

  1. printf("%d" + 0, c)

    printf("%d", c); 
    /* prints the value of c */
    
  2. printf("%d" + 1, c)

    printf("d", c); 
    /* prints 'd' */
    
  3. printf("%d" + 2, c)

    printf("", c);
    /* the format string is empty nothing printed */
    
  4. 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

所以它正在从给定的字符串中获取字符。