变量初始化计算结果出乎意料
Variable initialization evaluates to something unexpected
如果在下面这行之后调用 printf("%d",nl);
,为什么 int 变量 nl
的计算结果为 33881
?
nl, nw, nc = 0;
它怎么可能在循环之前评估为 0
以外的任何其他值?我在我的 ARM Chromebook 上的 crouton/Ubuntu 12.04LTS 环境中从终端使用 gcc
进行编译,所以我不知道这是代码中的错误还是我的机器中的错误。
#include <stdio.h>
#define IN 1
#define OUT 0
main() {
int c, nl, nw, nc, state;
state = OUT;
nl, nw, nc = 0;
while ((c = getchar()) != EOF ) {
++nc;
if (c == '\n') {
++nl;
}
if (c == ' ' || c== '\n' || c== '\t') {
state = OUT;
} else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl,nw,nc);
}
我尝试添加另一行声明 nl = 0;
以强制程序使用 return 可预测值,但我仍然无法理解这种行为。
这个
nl, nw, nc = 0;
不初始化nl
;如果启用编译器警告,它会告诉您逗号运算符的左操作数无效,因为 ,
运算符会忽略所有左操作数并保留最后一个。要一次初始化所有变量,您需要这样做:
nl = nw = nc = 0;
由于nl
未初始化,它包含一个垃圾值;你需要明确地初始化它。
编译器警告也会抱怨 nl
和 nw
未初始化。
行
nl, nw, nc = 0;
会初始化变量"nc",但是变量"nl"和"nw"会收到一些随机数。
要初始化所有三个,您必须使用
nl = nw = nc = 0;
如果在下面这行之后调用 printf("%d",nl);
,为什么 int 变量 nl
的计算结果为 33881
?
nl, nw, nc = 0;
它怎么可能在循环之前评估为 0
以外的任何其他值?我在我的 ARM Chromebook 上的 crouton/Ubuntu 12.04LTS 环境中从终端使用 gcc
进行编译,所以我不知道这是代码中的错误还是我的机器中的错误。
#include <stdio.h>
#define IN 1
#define OUT 0
main() {
int c, nl, nw, nc, state;
state = OUT;
nl, nw, nc = 0;
while ((c = getchar()) != EOF ) {
++nc;
if (c == '\n') {
++nl;
}
if (c == ' ' || c== '\n' || c== '\t') {
state = OUT;
} else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl,nw,nc);
}
我尝试添加另一行声明 nl = 0;
以强制程序使用 return 可预测值,但我仍然无法理解这种行为。
这个
nl, nw, nc = 0;
不初始化nl
;如果启用编译器警告,它会告诉您逗号运算符的左操作数无效,因为 ,
运算符会忽略所有左操作数并保留最后一个。要一次初始化所有变量,您需要这样做:
nl = nw = nc = 0;
由于nl
未初始化,它包含一个垃圾值;你需要明确地初始化它。
编译器警告也会抱怨 nl
和 nw
未初始化。
行
nl, nw, nc = 0;
会初始化变量"nc",但是变量"nl"和"nw"会收到一些随机数。
要初始化所有三个,您必须使用
nl = nw = nc = 0;