c - C编程中需要什么时候初始化变量

标签 c variables

我是 C 编程的初学者,在我编写的这段代码中,编译器坚持要我为变量 ch2ch3 设置初始值。 让我感到困惑的是,为什么在这种情况下需要这样做,我什么时候需要初始化变量的值,什么时候不需要(通常)?

#include <stdio.h>
#include <conio.h>

int main(void) {
    int ch, ch1 = 0, ch2 = 0, ch3 = 0;
    while (1) {
        ch = _getche();
        ch1 = ch2;
        ch2 = ch3;
        ch3 = ch;
        if (ch1 == 'h' && ch2 == 'e' && ch3 == 'y') {
            break;
        }
    }
    printf("\nHello !");
}

最佳答案

C 中唯一的约束是对象必须先初始化,然后才能读取它们的值。

具有 static 存储类的全局对象和局部对象在进程启动时自动初始化,或者从您在源代码中编写的显式初始化程序定义,或者到它们的零值(和它们的所有成员和聚合元素)如果在源代码中的定义点没有初始值设定项。零值对于数字和字符类型是 0,对于指针是 NULL。 union 的第一个成员被初始化为其零值。

其他本地对象默认不初始化,因此您必须在定义时提供初始化器或在读取它们的值之前将值存储到它们中。

在您的示例中,在 while 循环中,ch2ch3 的值在写入之前被读取。这些必须在循环之前初始化,但是在 if 之前的 chch1 中存储了一个值,因此它们不需要初始化在循环之前。您可以安全地删除 ch1 的初始值设定项。

编译器警告您初始化 ch2ch3 的原因是为了避免在循环的第一次迭代期间出现未定义的行为。如果在第一次迭代,只需点击 y 就足以打破循环。

我强烈建议您在启用警告的情况下编译代码,以允许编译器诊断未初始化变量的潜在用途。它并不完美,可能同时存在误报和漏报,但诊断通常非常有用,可以避免导致未定义行为的愚蠢错误。

将所有局部变量初始化为常量并没有坏处。编译器通常足够聪明,可以删除冗余存储,即:它们不会生成用于将值存储到非 volatile 局部变量的代码,这些局部变量在接收另一个值或超出范围之前未使用。

请注意,您的代码可以通过这种方式减少一个变量:

#include <stdio.h>
#include <conio.h>

int main(void) {
    int ch = 0, ch1 = 0, ch2;
    for (;;) {
        ch2 = ch1;
        ch1 = ch;
        ch = _getche();
        if (ch2 == 'h' && ch1 == 'e' && ch == 'y') {
            break;
        }
    }
    printf("\nHello !\n");
    return 0;
}

关于c - C编程中需要什么时候初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41038659/

相关文章:

c - 想要使用 ASM 进行快速 8 字节对齐数组复制而不是 memmove

php - 一个 mysqli 连接用于多个数据库功能

javascript - 数组内的对象

c - 重新分配打印出错误

C Web 服务器,图像未显示在浏览器上?

mysql - 在mysql中创建一个复杂的变量

mysql - 触发器从源表和另一个表插入数据

javascript - 字符串到整数未正确定义

iphone - #import 仍然出现 "duplicate symbol"错误

c - 如何在 Autoconf/Automake 项目中拥有 apache 模块和依赖的共享库