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
初始化为零。对 b
、t
左侧*和右侧两个尾随零的求值没有副作用 =
运算符(注意赋值比逗号运算符具有更高的优先级).
改为:
b = t = nl = 0;
这实际上意味着(因为 =
运算符具有正确的结合性):
b = (t = (nl = 0));
*除非 b
或 t
声明为 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;
虽然您当前的代码编译的原因有点奇怪:它将代码中的逗号视为逗号运算符,这在赋值的两边都是合法的。
这些都是垃圾值。您需要将变量 b
、t
和 nl
分别分配给 0。
我正在尝试编写一个 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
初始化为零。对 b
、t
左侧*和右侧两个尾随零的求值没有副作用 =
运算符(注意赋值比逗号运算符具有更高的优先级).
改为:
b = t = nl = 0;
这实际上意味着(因为 =
运算符具有正确的结合性):
b = (t = (nl = 0));
*除非 b
或 t
声明为 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;
虽然您当前的代码编译的原因有点奇怪:它将代码中的逗号视为逗号运算符,这在赋值的两边都是合法的。
这些都是垃圾值。您需要将变量 b
、t
和 nl
分别分配给 0。