我应该将分配放在for循环中还是从循环中取出?

时间:2018-09-25 06:17:30

标签: c function loops location

#include <stdio.h>
void print1(int m, int n, double (*p)[m][n]);
void print2(int m, int n, double (*p)[m][n]);
void print3(int m, int n, double (*p)[m][n]);
void print4(int m, int n, double (*p)[m][n]);
void print5(int m, int n, double (*p)[m][n]);
int main(void)
{
    double a[3][2] = {{1, 2}, {3, 4}, {5, 6}};

    print1(3, 2, &a);
    print2(3, 2, &a);
    print3(3, 2, &a);
    print4(3, 2, &a);
    print5(3, 2, &a);

    return 0;
}
void print1(int m, int n, double (*p)[m][n])
{
    double subTotal;
    subTotal = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            subTotal += (*p)[j][i];
            printf("%lf~~~", subTotal);
        }
        printf("\n");
    }
    printf("******************\n");
}
void print2(int m, int n, double (*p)[m][n])
{
    double subTotal;
    for (int i = 0, subTotal = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            subTotal += (*p)[j][i];
            printf("%lf~~~", subTotal);
        }
        printf("\n");
    }
    printf("******************\n");
}
void print3(int m, int n, double (*p)[m][n])
{
    double subTotal;
    for (int i = 0; i < n; i++) {
        subTotal = 0;
        for (int j = 0; j < m; j++) {
            subTotal += (*p)[j][i];
            printf("%lf~~~", subTotal);
        }
        printf("\n");
    }
    printf("******************\n");
}
void print4(int m, int n, double (*p)[m][n])
{
    double subTotal;
    for (int i = 0; i < n; i++) {
        for (int j = 0, subTotal = 0; j < m; j++) {
            subTotal += (*p)[j][i];
            printf("%lf~~~", subTotal);
        }
        printf("\n");
    }
    printf("******************\n");
}
void print5(int m, int n, double (*p)[m][n])
{
    double subTotal;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            subTotal = 0;
            subTotal += (*p)[j][i];
            printf("%lf~~~", subTotal);
        }
        printf("\n");
    }
    printf("******************\n");
}

看上面的代码。我写了五个C函数,分别是打印1〜打印5。

它们之间的唯一区别是 subTotal = 0

的位置

对于我来说,print1,print3和print5很容易理解。

我希望print2与print1相同,而print4与print3相同。

但是输出证明我错了。输出为:

1.000000~~~4.000000~~~9.000000~~~
11.000000~~~15.000000~~~21.000000~~~
******************
0.000000~~~0.000000~~~0.000000~~~
0.000000~~~0.000000~~~0.000000~~~
******************
1.000000~~~4.000000~~~9.000000~~~
2.000000~~~6.000000~~~12.000000~~~
******************
0.000000~~~0.000000~~~0.000000~~~
0.000000~~~0.000000~~~0.000000~~~
******************
1.000000~~~3.000000~~~5.000000~~~
2.000000~~~4.000000~~~6.000000~~~
******************

我想不出为什么print2和print4的打印结果与我的预期不同。

为什么我理解错了?

2 个答案:

答案 0 :(得分:4)

这里for(int i = 0, subTotal = 0; ...在循环的init语句中定义了两个变量。第一个是int i,第二个是int subTotal,它将double subTotal隐藏在函数顶部(不使用)。

因此,print2print4使用%lf格式说明符来打印整数,这是未定义的行为。

添加-Wall -Wextra -Wshadow to GCC会警告所有这些效果。

答案 1 :(得分:2)

为什么为print2和print4打印0的问题:
您正在使用%lf格式说明符来打印subtotal循环本地的整数for。 C委员会关于printffprintf的草案指出:

  

7.21.6格式化的输入/输出功能
  ...
  如果转换规范无效,则行为未定义。 如果任何参数不是对应转换规范的正确类型,则行为为   未定义。