【问题标题】:How come the output of following code : DoSecond [duplicate]以下代码的输出如何:DoSecond [重复]
【发布时间】:2017-06-06 20:37:21
【问题描述】:
#include <stdio.h>
    int main()
    {
        switch (printf("Do"))
        {
        case 1:
            printf("First\n");
            break;
        case 2:
            printf("Second\n");
            break;
        default:
            printf("Default\n");
            break;
        }
    }

有人能解释一下上面的代码是如何工作的吗? switch如何跳转到case2标签?

【问题讨论】:

    标签: c++ c switch-statement printf


    【解决方案1】:

    检查man page 是否有printf()。它提到了

    返回值

    成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的空字节)。

    这里,printf() 调用的返回值用作switch 语句控制表达式值。因此,在这种情况下,为了打印字符串 "Do",它返回 2。这与大小写标签 2 匹配。

    然后,标准输出被行缓冲。在第一个printf() 之后,您没有flushing 指令或newline,因此下一个printf() 调用的连续输出与输出缓冲区并列,最后在遇到@987654330 之后@,它会一起刷新到控制台/终端,显示"DoSecond"

    也就是说,int main() 至少应该是 int main(void),以符合托管环境的标准。

    【讨论】:

      【解决方案2】:

      printf 的返回值为

      如果成功则写入的字符数,如果发生错误则为负值。

      所以"Do" 有 2 个字符,所以切换到 case 2:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 2016-11-01
        相关资源
        最近更新 更多