【问题标题】:How does the following code works printf("%c")?下面的代码是如何工作的 printf("%c")?
【发布时间】:2020-12-17 23:23:36
【问题描述】:

我想知道下面的程序是如何工作的?

#include <stdio.h>
int main(void) {
    while(1){
        if(printf("%d",printf("%c")))
        break;
        else
        continue;
    }
    return 0;
}

我不知道 printf("%c") 部分是如何工作的,因此也不知道整个程序。我知道编写类似 printf("%c", 'a'); 的东西。像那样,但是如果不提供要打印的字符,它是如何工作的?我的问题是以下程序打印什么以及它是如何打印的?

我尝试运行该程序,有时它什么也不打印,但有时它打印一些随机字符,后跟 1。我无法了解它是如何工作的,有人可以解释一下代码背后的原因吗?它是如何打印随机字符的,为什么最后有一个?

这是我得到的一些输出

【问题讨论】:

  • 您正在调用未定义的行为:它只是似乎工作,但它已经坏了。
  • 内部printf 调用缺少参数:printf("%c") %c 格式需要一个整数参数,它被打印为一个字符。例如,printf("%c", 'x') 将是有效的。你的编译器应该给你一个警告(如果没有,考虑提高警告级别)。
  • 节省时间 - 启用更多警告以快速检测 printf("%c") 是问题代码。

标签: c if-statement output printf


【解决方案1】:

这是关于格式错误的。

看这段代码,当执行 printf("%d", 123) 时,程序会将数字 123 压入堆栈,然后压入字符串 "%d",当 printf 遇到 "%d" 时,会读取栈顶的值,所以 printf 找到数字 123。

现在看这段代码,printf("%c"),程序会将字符串“%c”压入栈中,并尝试读取栈顶的值,你还没有压入 printf 的值,所以 printf 仍然会找到值,但是该值是随机的,所以你可能会得到一个随机值。

【讨论】:

    【解决方案2】:

    你有一个很酷的错误程序。

    printf("%c") 尝试打印应该是第二个参数的单个字符。但是,由于您从未传递过第二个参数,因此该函数会打印 寄存器中应该有 第二个参数的任何内容。换句话说,一些随机字符。但是,它打印一个字符并返回 1:打印的字符数。

    那个 1 又由printf("%d",printf("%c")) 打印。现在你有一个随机字符后跟 1,由于外部 printf 也打印一个字符,所以它返回 1。

    最后,if(printf("%d",printf("%c"))) 将后面的 1 解释为 true 并中断循环。

    【讨论】:

      【解决方案3】:

      欢迎来到未定义的行为。您指定的格式没有足够数量的参数,例如

      C11 Standard - 7.21.6.1 The fprintf function(p2) "如果格式的参数不足,则行为未定义。" 7.21.6.1(p9) "如果转换规范无效,则行为未定义。如果有参数不是相应转换规范的正确类型,行为未定义。"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        相关资源
        最近更新 更多