可以将地址运算符应用于 C 中结构的非整型和非整型的二维数组



我读过一本C书,它说,如果我们可以将地址运算符应用于整数类型(例如短,整,长)的二维数组的元素。例如,如果类型是浮点型,那么我们必须使用一个临时变量。代码示例:

int i, j;
int arr[4][4];
for (i = 0; i < 2; ++i)
   for (j = 0; j < 2; ++j)
       scanf("%d", &a[i][j]); /* OK because of int type */

但这是不行的:

int i, j;
float arr[4][4];
for (i = 0; i < 2; ++i)
   for (j = 0; j < 2; ++j)
       scanf("%f", &a[i][j]); /* NOT OK because of float type - not integral type */

我们必须使用临时变量:

int i, j;
float temp;
float arr[4][4];
for (i = 0; i < 2; ++i)
   for (j = 0; j < 2; ++j) {
       scanf("%f", &temp); /* OK */
       a[i][j] = temp;     /* then assign back to element of 2d array */
   }

作者说结构没有积分场的相同概率。

typedef struct {
    char name[20];
    int id;
    float grade;
} Student;

Student s;
float temp;
scanf("%d", &s.id);        /* OK becuase of integral type */
/* scanf("%f", &s.grade);  NOT OK because of float type */
scanf("%f", &temp);  /* OK */
s.grade = temp;      /* assign back */

作者只是用C说,就是这样,但没有解释。这很奇怪,我以前从未听说过这个,因为我在Visual Studio 6.0,Visual Studio 2010(添加扩展名为.c的新文件)上测试程序,它可以正常工作而无需使用临时变量
是历史问题——老C式吗?
C++有这种限制吗?

我会认真考虑寻找新作者:

#include <stdio.h>
int main(int argc, char *argv[])
{
    int i, j;
    float arr[4][4];
    for (i = 0; i < 2; ++i)
        for (j = 0; j < 2; ++j)
            scanf("%f", &arr[i][j]);
    for (i=0;i<2;++i)
        for (j=0;j<2;++j)
            printf("%fn", arr[i][j]);
    return 0;
}

输入

1.01
2.01
3.01
4.01

输出

1.010000
2.010000
3.010000
4.010000

也许更多关于他/她的理由的信息会有所帮助,但除非有任何真正的肉来证明这种说法,我会在我的鸟笼里放上那本书。他的说法背后可能有历史。我唯一能理解的是float的性质(即它的具体实现性质)。大多数人使用IEEE 754单prec进行float,双prec用于double。但我给了他很大的自由度,试图理解他这种说法的逻辑。

最新更新