1

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

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 */
   }

作者说 struct 没有整数字段也存在同样的问题。

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++ 中有这个限制吗?

4

1 回答 1

1

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

#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("%f\n", arr[i][j]);
    return 0;
}

输入

1.01
2.01
3.01
4.01

输出

1.010000
2.010000
3.010000
4.010000

也许更多关于他/她的理由的信息会有所帮助,但除非有任何真正的肉来提出这样的要求,否则我会在我的鸟笼里放那本书。他的说法背后可能有一些历史。我能理解的唯一相关的是它的性质float(即它的特定于实现的性质)。大多数人都使用 IEEE 754 single-prec for float, double-prec for double. 但我给了他很大的自由度来试图理解他的主张的逻辑。

于 2013-01-24T04:12:42.173 回答