我正在尝试编写一个 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。
最佳答案
问题出在这一行:
b, t, nl = 0, 0, 0;
它在赋值的两边都使用逗号运算符,因此只有 nl
被初始化为零。 b
、t
左侧*和右侧两个尾随零的计算没有副作用 =
运算符(注意该赋值比逗号运算符具有更高的优先级)。
将其更改为:
b = t = nl = 0;
这实际上意味着(因为 =
运算符具有正确的结合性):
b = (t = (nl = 0));
*除非 b
或 t
被声明为 volatile
(因为读取此类对象被 C 算作副作用标准)
关于C 整数关闭,可能溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27735283/