c - 变量初始化计算结果出乎意料

标签 c linux gcc initialization runtime

如果您在此之后调用 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; 以强制程序返回可预测的值,但我仍然无法理解这种行为。

最佳答案

这个

nl, nw, nc = 0;

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

nl = nw = nc = 0;

由于 nl 是未初始化的,它包含一个垃圾值;您需要显式初始化它。

编译器警告还会提示 nlnw 未初始化。

关于c - 变量初始化计算结果出乎意料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28660490/

相关文章:

c - 二维数组,按总和对行进行排序

c - 在正则表达式中匹配正斜杠

linux - 如何去掉某列中的下划线以及下划线后面的数字?

linux - 如何编写Shell脚本来设置默认参数

c - 如何从汇编例程调用 C 函数并使用 nasm 和 gcc 链接 C 和汇编文件

c - 如何将基于 C 的语言添加到 GCC

c++ - 混合 C C++ 代码时动态库中的链接问题

c++ - 为什么这是一个未定义的行为?

python - 当程序启动时运行Python脚本

c - 有没有办法检查程序上次运行的时间? (Unix 中的 C)