我是 C 编程的初学者,在我编写的这段代码中,编译器坚持要我为变量 ch2
和 ch3
设置初始值。
让我感到困惑的是,为什么在这种情况下需要这样做,我什么时候需要初始化变量的值,什么时候不需要(通常)?
#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
循环中,ch2
和 ch3
的值在写入之前被读取。这些必须在循环之前初始化,但是在 if
之前的 ch
和 ch1
中存储了一个值,因此它们不需要初始化在循环之前。您可以安全地删除 ch1
的初始值设定项。
编译器警告您初始化 ch2
和 ch3
的原因是为了避免在循环的第一次迭代期间出现未定义的行为。如果在第一次迭代,只需点击 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/