我正在尝试创建一个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.
答案 0 :(得分:12)
问题在于这一行:
b, t, nl = 0, 0, 0;
它在赋值的两侧使用逗号运算符,因此只有nl
初始化为零。评估左侧的b
,t
*和=
运算符右侧的两个尾随零没有副作用(请注意,赋值优先级高于逗号运算符) )。
将其更改为:
b = t = nl = 0;
实际上意味着(因为=
运算符具有正确的关联性):
b = (t = (nl = 0));
*除非b
或t
被声明为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)
这些是垃圾值。您需要将变量b
,t
和nl
分别指定为0。