作者:gete | 来源:互联网 | 2023-05-28 18:12
我正在尝试制作一个C程序,用于计算和打印用户输入的制表符,空格和行数.问题在于,当它打印出这些数字时,它们就会大放异彩.这是我的程序代码:
int c, b, t, nl;
b, t, nl = 0, 0, 0;
while ((c = getchar()) != EOF)
{
if (c == '\b')
b++;
if (c == '\t')
t++;
if (c == '\n')
nl++;
}
printf("b=%d t=%d nl=%d\n", b, t, nl);
当我从终端输入一些数据时(3行,一个空格,一个标签),结果是b = 1899313536,t = 32768,并且nl = 3.
1> Grzegorz Szp..:
问题出在这一行:
b, t, nl = 0, 0, 0;
它在赋值的两侧使用逗号运算符,因此只用nl
初始化为零.有没有副作用的评价b
,t
在左侧*和的右侧有两个尾随零=
操作(注意分配具有更高的优先级,比逗号操作).
将其更改为:
b = t = nl = 0;
这实际上意味着(因为=
运营商具有正确的相关性):
b = (t = (nl = 0));
*除非b
或被t
宣布为volatile
(由于C标准将此类对象的读数计为副作用)