使用 putchar 进行整数提升

Integer promotion with putchar

"函数 returns 将作为无符号字符写入的字符在出错时转换为 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。为什么这样的提升并不像我预期的那样?

因为 putchar ('2') 总是 != 0 并且您执行 putchar('4') 然后执行其中的操作 putchar('3) 然后条件检查 putchar('2') 始终为真并且你转到这个循环的开头

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

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

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

The fputc function writes the character specified by c (converted to an unsigned char) to the output stream pointed to by stream, [...]

The putchar function is equivalent to putc with the second argument stdout.

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

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

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

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

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

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