C整数关闭,可能溢出

时间:2015-01-01 22:27:58

标签: c integer integer-overflow

我正在尝试创建一个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.

4 个答案:

答案 0 :(得分:12)

问题在于这一行:

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

它在赋值的两侧使用逗号运算符,因此只有nl初始化为零。评估左侧的bt *和=运算符右侧的两个尾随零没有副作用(请注意,赋值优先级高于逗号运算符) )。

将其更改为:

b = t = nl = 0;

实际上意味着(因为=运算符具有正确的关联性):

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

*除非bt被声明为volatile(因为C标准将此类对象的读数计为副作用)

答案 1 :(得分:3)

b是无效的,这个表达是错误的

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

它只会初始化nl,它应该是

b = t = nl = 0;

答案 2 :(得分: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;

然而,您当前代码编译的原因有点奇怪:它将代码中的逗号视为逗号运算符,这对于赋值的双方都是合法的。

答案 3 :(得分:2)

这些是垃圾值。您需要将变量btnl分别指定为0。