C 我应该把作业放在for循环中还是放在外面?

C 我应该把作业放在for循环中还是放在外面?,c,function,loops,location,C,Function,Loops,Location,我想不出为什么print2和print4打印的结果与我的预期不同 为什么我理解错了?这里的for(int I=0,subTotal=0;…在循环的init语句中定义了两个变量。第一个变量是int I,第二个变量是int subTotal,它隐藏了函数顶部的双subTotal(不使用) 因此,print2和print4使用%lf格式说明符打印整数,这是未定义的行为 添加会对所有这些效果产生警告。此处的for(int i=0,subTotal=0;…在循环的init语句中定义了两个变量。第一个变量是

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

为什么我理解错了?

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

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

添加会对所有这些效果产生警告。

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

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


添加会对所有这些效果产生警告。

关于为什么打印2和打印4打印0的问题:
您正在使用
%lf
格式说明符为
循环打印
局部的整数
小计。
C委员会关于
printf
fprintf
的草案规定:

7.21.6格式化输入/输出功能

如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为为 未定义。


关于为什么打印2和打印4打印0的问题:
您正在使用
%lf
格式说明符为
循环打印
局部的整数
小计。
C委员会关于
printf
fprintf
的草案规定:

7.21.6格式化输入/输出功能

如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为为 未定义。


我没有使用%lf格式说明符打印整数。小计是双精度的。@SleepingNagiant'sShoulder-第一段解释了它为什么打印整数。我理解。谢谢。我没有使用%lf格式说明符打印整数。小计是双精度的。@SleepingNagiant'sShoulder-第一段解释了为什么打印整数为什么要打印一个整数,我明白了,谢谢。
#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");
}
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~~~
******************