为什么在 C 中对变量执行任何赋值之前需要对其进行初始化?

Why it is necessary to initialize a varriable before performing any assignment to it in C?

#include <stdio.h>
int main(){
    int sale;
    float comm = 0;
    
    printf("enter the sale amount: ");
    scanf("%d",&sale);
    
    if (sale < 10000) { 
    comm = 0; 
    }
    else if (sale >= 10000 && sale < 15000){
        comm = sale * 0.05;
    } else if (sale >= 15000 && sale < 25000) {
        comm = 0.1 * sale;
    } else if(sale > 25000) {
        comm = 0.15 * sale;
    }
    
    printf("commission is %f",comm);
    
    return 0;
}

在上面的代码中,如果不在顶部初始化为 0,则无法分配 comm 变量。它不会抛出错误,但每当我打印它时,它的值始终为 0。背后的原因是什么?请哪位大神详细解释一下。

只有在用户输入 25000 时初始化 comm 才“有必要”,因为它有一个值——这是唯一不匹配任何 if 语句的值, 所以不会给 comm.

赋值

如果用户输入 X 或任何其他非数字的内容,也可能会出现问题。在那种情况下 sale 将不会被设置,并且将继续未初始化,因此任何情况都可能触发。

在这种情况下,您实际上不必初始化通信。代码很好,它应该可以工作,也许你尝试的数字太小(小于 10000),这就是为什么它给你 0。尝试仔细检查尝试更大的数字:)

请完成 if else 声明。我的意思是也包含 else 语句。这样,如果控件确实找到任何合适的条件,它可以进入 else 语句并初始化 comm 个变量。

C 不自动将所有局部变量初始化为零的原因是“C 的精神”,除非另有说明,否则选择性能而不是安全。是否使用最大性能或最大 safety/defensive-programming 的决定留给程序员。而其他编程语言可能不会让您选择并始终选择更安全的选项。

在你的情况下不需要初始化。因此,如果代码首先显式地将变量设置为零,然后几乎立即用一个值覆盖它,那么这将只是无用的开销代码。

类似地,当使用堆分配时,您有两个选择:malloc 速度快但不执行 zero-init,或者 calloc 速度较慢但执行 zero-init ].