在printf函数中使用“%d”+常量

时间:2015-01-03 07:59:02

标签: c printf

#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

任何人都可以解释原因吗?

4 个答案:

答案 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}}

  1. printf

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

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

    printf("%d" + 2, c)
  4. printf("", c); /* the format string is empty nothing printed */ 这里printf会得到一个指向缓冲区的地址,即未定义的行为

  5. 最后

    printf("%d" + 3, c)
    打印

    您的程序可能会在1d 收到分段错误信号,但如果在分段错误之前刷新printf("%d" + 3, c),则仍会打印1d