-1
#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]);
    }
}

total[0]并且total[1]是正确的值,但是total[2]是错误的值。我找不到我的错。你能解释一下吗?

4

1 回答 1

7

这里的第一个问题在代码中

        total[0]+=a[j];
        total[1]+=b[j];
        total[2]+=c[j];

你在哪里使用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内存顺序语义的操作。

因此,通过+=在未初始化的值上使用 _you 试图读取(或使用)具有不确定值的变量,这会导致 UB。

如果需要,您可以使用如下语法初始化整个数组

  int total[3] = {0};

它将数组的所有元素初始化为 0,这基本上是您所期望的。

也就是说,在托管环境void main(void)中不是一个符合要求的签名,根据规范,它至少main()应该是。int main(void)

于 2016-09-14T13:18:42.530 回答