变量初始化评估为意外的事情

时间:2015-02-22 16:50:18

标签: c linux gcc initialization runtime

如果在以下行之后调用nl,为什么int变量33881会计算为printf("%d",nl);

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;来强制程序返回可预测的值,但我仍然无法理解这种行为。

2 个答案:

答案 0 :(得分:1)

nl, nw, nc = 0;

未初始化nl;如果启用编译器警告,它将告诉您逗号运算符的左操作数无效,因为,运算符忽略所有左操作数并保留最后一个操作数。要一次初始化所有变量,您需要:

nl = nw = nc = 0;

由于nl未初始化,因此它包含垃圾值;你需要明确地初始化它。

编译器警告也会抱怨nlnw未初始化。

答案 1 :(得分:0)

该行

nl, nw, nc = 0;

将初始化变量&#34; nc&#34;,但变量&#34; nl&#34;和&#34; nw&#34;将收到一些随机数。

要初始化所有三个,您必须使用

nl = nw = nc = 0;