C 整数关闭,可能溢出

C integers off, possible 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。

b uinintiaized 这个表达式是错误的

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

只初始化了nl,应该是

b = t = nl = 0;

这一行有问题:

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

它在赋值的两边都使用逗号运算符,因此只有 nl 初始化为零。对 bt 左侧*和右侧两个尾随零的求值没有副作用 = 运算符(注意赋值比逗号运算符具有更高的优先级).

改为:

b = t = nl = 0;

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

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

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

不同于 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;

虽然您当前的代码编译的原因有点奇怪:它将代码中的逗号视为逗号运算符,这在赋值的两边都是合法的。

这些都是垃圾值。您需要将变量 btnl 分别分配给 0。