【问题标题】:How the printf is working? [duplicate]printf 是如何工作的? [复制]
【发布时间】:2014-08-25 17:30:30
【问题描述】:
int main()
{
    int c=5;
    printf("%d\n%d\n%d", c, c<<=2, c>>=2);
    return 0;
}

我不知道在 printf 函数中分配是如何发生的。输出是 4,4,4,但据我说应该是 4,4,1。

【问题讨论】:

  • 根据标准,这是未定义的行为。您似乎希望从左到右评估函数参数。它们可能是也可能不是。
  • 您应该将正确的语言标签添加到您的问题cc++
  • @Sayse 这显然是 C,而不是 C++。
  • @user3477950 - 我已经有一年多没有写任何东西了,我不记得语法了

标签: c printf


【解决方案1】:

您对c 的修改之间没有序列点,因此行为未定义。

您需要明确地施加顺序。例如:

int main(void)
{
     int c = 5;
     int d = c >> 2;
     int e = d << 2;
     printf("%d\n%d\n%d", c, e, d);
     return 0;
}

当然,您应该要求编译器报告警告。如果你这样做了,并且假设你的编译器是有能力的,那么它会警告你这个问题。例如,当被要求使用 -Wall 选项编译您的程序时,我的 GCC 报告:

main.c:在函数'main'中: main.c:6:37:警告:“c”上的操作可能未定义 [-Wsequence-point] printf("%d\n%d\n%d", c, c>=2); ^ main.c:6:37:警告:“c”上的操作可能未定义 [-Wsequence-point]

【讨论】:

    【解决方案2】:

    编译时应使用-Wall 标志。

    我明白了:

    ../main.c:6:37: warning: operation on ‘c’ may be undefined [-Wsequence-point]
    ../main.c:6:37: warning: operation on ‘c’ may be undefined [-Wsequence-point]
    

    例如这段代码被破坏了:

    c&lt;&lt;=2

    因为在您对c 的修改之间没有序列点。

    应该是这样的:

    int a = c &lt;&lt; 2;

    因此,您的代码会导致未定义的行为。

    【讨论】:

    • @Deduplicator 我更新了我的答案,从另一个答案中获取了一些东西,因为另一个答案显然得到了我的警告(但这很好,因为它更好)。 :)
    最近更新 更多