【问题标题】:Strange printf and puts statements explained奇怪的 printf 和 puts 语句解释
【发布时间】:2014-03-10 05:48:53
【问题描述】:

我在一个SNS相册里看到了这两条语句,标题是“我见过的最优雅的输出方式”之类的。

下面是两条语句:

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

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

【问题讨论】:

  • 我在这里没有看到任何“优雅”,只是可怕的混淆代码。
  • @alk 我不知道如何描述它,所以我选择了elegant 这个词。您可以将标题替换为您认为合适的内容:)
  • 我实际上并没有指您的问题的标题,而是您引用的标题:“我见过的最优雅的输出方式
  • 然而,参考您的问题的标题,我在问题中没有看到一个 <bool-expr>?<expr1>:<expr2> 操作(三元运算符)。
  • @alk 嗯,这就是照片的原始描述......所以有人认为这更优雅。

标签: c printf puts


【解决方案1】:

" \n"[i==n] 采用表达式 i==n,其计算结果为 0 或 1,并将其用作数组 " \n" 的索引,获得 ' ''\n'

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

【讨论】:

    【解决方案2】:

    如果是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 
    

    【讨论】:

    • 严格挑剔,它打印N0而不是NO...
    • @Jonathan Leffler 没错!
    • @JonathanLeffler 我的错,应该是No :)
    • @laike9m:我知道;我只是在取笑你和chux。意图很明确;代码与意图不太匹配,但不匹配并没有什么大问题。因此,“严格挑剔”标签。
    猜你喜欢
    • 2017-03-03
    • 2011-03-20
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多