使用 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
。它不会将转换为 int
的 char
打印到标准输出。如果你说:putchar('z')
,它会打印 'z'
putchar(2)
在每次迭代开始时 return char '2' 的 int 值恰好是非零。这也意味着循环永远不会结束。
putchar('3')
在每次迭代结束时执行。
putchar('4')
在每次迭代的开始和结束之间。
这就是您获得该输出的原因。
"函数 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 byc
(converted to an unsigned char) to the output stream pointed to bystream
, [...]
和
The
putchar
function is equivalent toputc
with the second argumentstdout
.
所以,它是将要打印的字符表示,'4'
的字符表示是 4
。
它确实打印了 124324324324....
,因为 putchar(1)
在循环开始时执行,并且再也不会执行。
Putchar 在标准输出上打印 char
,并且 return 将相同的 char
转换为 int
。它不会将转换为 int
的 char
打印到标准输出。如果你说:putchar('z')
,它会打印 'z'
putchar(2)
在每次迭代开始时 return char '2' 的 int 值恰好是非零。这也意味着循环永远不会结束。
putchar('3')
在每次迭代结束时执行。
putchar('4')
在每次迭代的开始和结束之间。
这就是您获得该输出的原因。