【问题标题】:Integer promotion with putchar使用 putchar 进行整数提升
【发布时间】:2017-12-18 08:38:25
【问题描述】:

该函数将写入为 unsigned char 类型转换的字符在错误时返回到 int 或 EOF”:see Putchar。 为了练习,我制作了这个程序:

#include<stdio.h>

int main(void){
  for(putchar('1'); putchar('2'); putchar('3'))
    putchar('4');
  return 0;
}

它会导致一个无限循环,输出...432432432432432...。 我无法得到这种结果背后的原因。我希望循环一遍又一遍地打印相同的数字。我指的是 putchar('4') 的值,其中字符 '4' 应该提升为 int 52。为什么这样的提升不符合我的预期?

【问题讨论】:

  • put...char....这个名字是什么意思?那为什么不putint()呢?
  • 什么?带有奇怪期望的奇怪测试。
  • put_char 写入的是 ascii 字符,而不是十进制的 ascii 代码。
  • @SouravGhosh 我同意。我正在寻找对我的嫌疑人的确认。
  • 而简单搜索putchar 的规范太复杂,无法“确认您的嫌疑人”?

标签: c for-loop putchar


【解决方案1】:

在您的情况下,根据循环策略,

  • putchar('1') 执行一次。
  • putchar('2') 被评估,发现为 TRUTHY,putchar('4'); 被执行,然后putchar('3'); 被执行。
  • 返回上一步,除非 putchar('2') 为 FALSY(永远不会发生)。
  • 因此无限循环,并且每次循环迭代都包含 三个 putchar 语句。

与问题 "....其中字符 '4' 应提升为 int 52" 相关,引用 C11, §7.21.7,(强调我的)

fputc 函数写入c 指定的字符(转换为无符号 char) 到stream 指向的输出流,[...]

putchar 函数等效于带有第二个参数 stdoutputc

所以,要打印的是字符表示,'4' 的字符表示就是4

【讨论】:

  • 我的错误是认为只有 putchar('4') 应该打印结果。感谢您对如此不寻常的循环的进行如此精彩的解释!
【解决方案2】:

它确实打印了124324324324....,因为putchar(1) 在循环开始时执行,并且不再执行。

Putchar 在标准输出上打印char,并返回与int 相同的char。它不会将转换为intchar 打印到标准输出。如果你说:putchar('z'),它将打印'z'

putchar(2) 在每次迭代开始时返回 char '2' 的 int 值,该值恰好非零。这也意味着循环永远不会结束。

putchar('3') 在每次迭代结束时执行。

putchar('4') 在每次迭代的开始和结束之间。 这就是您获得该输出的原因。

【讨论】:

    【解决方案3】:

    因为 putchar('2') 总是 != 0 并且你执行 putchar('4') 然后执行 putchar('3) 然后条件检查 putchar('2') 总是 true 然后你去到这个循环的开始

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 2013-12-08
      • 2015-02-28
      • 2017-10-14
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多