C整数溢出问题

3

我正在尝试编写一个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
顺便说一句:int c 是一个好的适当类型,而不是 char c - chux - Reinstate Monica
4个回答

12
问题出在这行代码上:
b, t, nl = 0, 0, 0;

它在赋值的两侧使用逗号运算符,因此只有nl被初始化为零。对于左侧的bt的评估没有副作用,并且在=运算符的右侧有两个尾随零(请注意,赋值比逗号运算符具有更高的优先级)。
修改为:
b = t = nl = 0;

这实际上意味着(因为=运算符具有右结合性):

b = (t = (nl = 0));

*除非bt被声明为volatile(因为读取这样的对象被C标准视为副作用)

(注意:已保留HTML标签,不包含解释)

3

b没有被初始化,这个表达式是错误的。

b, t, nl = 0, 0, 0;

它只初始化了nl,应该是:

b = t = nl = 0;

2

与Lua或其他允许在单个语句中分配多个变量的编程语言不同,

v1, v2, v3 = c1, c2, c3; // <<== This is not a valid C syntax.

在C语言中,你需要逐个赋值:

b = 0;
t = 0;
nl = 0;

更好的做法是,在声明变量时进行初始化,像这样:

初始化 变量:

int c, b=0, t=0, nl=0;

你当前的代码之所以可以编译通过,有点奇怪:它将代码中的逗号视为逗号运算符,这在赋值两侧都是合法的。

关于为什么这个编译的注释是有用的,但可能会稍微改进一下,通过展示没有它们的等效行。 - dmckee --- ex-moderator kitten

2

这些是垃圾值。您需要单独将变量btnl赋值为0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接