이동준*_*이동준 -1 c arrays initialization compound-assignment
#include<stdio.h>
void main(void)
{
int a[5]={90,78,77,98,98}, b[5]={80,45,67,88,57}, c[5]={88,99,65,55,74},total[3],i,j;
for(j=0;j<=4;j++)
{
total[0]+=a[j];
total[1]+=b[j];
total[2]+=c[j];
}
for(i=1;i<=3;i++)
{
printf("%d?? ?? ? : %d\n",i,total[i-1]);
}
}
Run Code Online (Sandbox Code Playgroud)
total[0]并且total[1]是正确的价值,但是total[2]错误的价值.我找不到自己的错.你能解释一下吗?
这里的第一个问题是在代码中
total[0]+=a[j];
total[1]+=b[j];
total[2]+=c[j];
Run Code Online (Sandbox Code Playgroud)
你在哪里使用total[n]s未初始化.它们包含不确定的值,并使用它们调用未定义的行为.
详细说明,total作为未初始化的自动局部变量,数组元素的初始值是不确定的.通过+=在这些元素上使用运算符,您尝试读取(使用)不确定的值,因此它会在您的情况下调用UB.
相关引用C11,第6.5.16.2章,复合赋值,
形式的复合赋值
E1 op= E2等同于简单赋值表达式E1 = E1 op (E2),除了左E1值仅被计算一次,并且对于不确定序列的函数调用,复合赋值的操作是单个求值.如果E1具有原子类型,则复合赋值是read-modify-write具有memory_order_seq_cst内存顺序语义的 操作.
因此,通过使用+=on uniniitilized值,_您试图读取(或使用)具有不确定值的变量,这会导致UB.
如果需要,可以使用类似的语法初始化整个数组
int total[3] = {0};
Run Code Online (Sandbox Code Playgroud)
它将数组的所有元素初始化为0,这基本上是你所期待的.
也就是说,在托管环境中void main(void)不是一致的签名main(),根据规范,int main(void)至少应该如此.