奇怪的printf和put语句解释

时间:2014-02-12 04:42:53

标签: c printf puts

我在SNS相册中看到了这两个陈述,标题是“我见过的最优雅的输出方式”等等。

以下是两个陈述:

printf("%d%c", a, " \n"[i==n]);
puts("YES\0No"+condition * 4);

我不知道他们在做什么以及他们是如何工作的。有人会向我解释一下吗?谢谢。

2 个答案:

答案 0 :(得分:6)

" \n"[i==n]获取表达式i==n,其值为0或1,并将其用作数组" \n"的索引,获取' '或{{ 1}}。

'\n'获取数组"YES\0N0"+condition * 4,当在大多数表达式(包括此表达式)中使用时,它'衰减'到指向其第一个元素的指针,并将"YES\0N0"添加到此指针。如果condition * 4为1,则会在condition开头生成指向'N'的指针。

答案 1 :(得分:1)

如果i != n,则会在%d之后打印一个空格,否则会换行。

//  printf("%d%c", a, " \n"[i==n]);

// when i != n
printf("%d%c", a, " \n"[0]); // or
printf("%d%c", a, ' ');      // or
printf("%d ", a);      // or

// when i == n
printf("%d%c", a, " \n"[1]); // or
printf("%d%c", a, '\n');     // or
printf("%d\n", a);     // or

打印数字分隔符的有趣方法,可能在for循环中使用。

类似于puts("YES\0N0"+condition * 4);

条件为0时,打印

puts("YES");`

当条件为1时,它会打印

puts("N0");`  // Thanks @ Jonathan Leffler