为什么在 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 ].
#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 ].