我读过一本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
。但我给了他很大的自由度,试图理解他这种说法的逻辑。