1

该函数将写入为 unsigned char 的字符转换为错误时的 int 或 EOF ”:请参阅 Putchar。为了练习,我制作了这个程序:

#include<stdio.h>

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

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

4

3 回答 3

4

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

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

与问题“....应该将字符'4'提升为int 52”相关,引用C11,§7.21.7,(强调我的

fputc函数将由(转换为无符号字符)指定的字符写入由, [...]cstream

putchar函数相当于putc带有第二个参数stdout

因此,将打印的是字符表示,而字符表示'4'是,嗯,4

于 2017-07-13T13:56:45.227 回答
2

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

Putcharchar在标准输出上打印,并返回相同的char转换为int. 它不会将转换后的内容打印charint标准输出。如果你说: putchar('z'),它将打印'z'

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

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

putchar('4')在每次迭代的开始和结束之间。这就是为什么你得到那个输出。

于 2017-07-13T14:00:37.590 回答
0

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

于 2017-07-13T13:54:06.117 回答