【问题标题】:Should I put an assignment in the for loop or out of it?我应该在 for 循环中还是在它之外放置一个赋值?
【发布时间】:2019-02-28 16:43:25
【问题描述】:
#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 函数,分别是 print 1 ~ print 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 打印的结果与我的预期不同。

为什么我理解错了?

【问题讨论】:

    标签: c function loops location


    【解决方案1】:

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

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

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

    【讨论】:

    • 我没有使用 %lf 格式说明符来打印整数。 subTotal 是双精度数。
    • @SleepingOnaGiant'sShoulder - 第一段解释了为什么它打印一个整数。
    • 我明白了。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2020-02-17
      • 1970-01-01
      相关资源
      最近更新 更多