C 与浮点数相比产生奇数输出的两倍

C 与浮点数相比产生奇数输出的两倍,c,C,我真的很想知道为什么当我使用double时,这会把我的代码搞砸。根据我的理解,double只是一个更精确的浮点数。然而在下面的代码中,如果我用double替换float,我会得到一个奇怪的输出,即使代码所做的只是获取输入,然后将其吐出 #include <stdio.h> int y; int z; int i; int n; int r; int c; float e; float d; void main() { puts("Enter Row Number:");

我真的很想知道为什么当我使用double时,这会把我的代码搞砸。根据我的理解,double只是一个更精确的浮点数。然而在下面的代码中,如果我用double替换float,我会得到一个奇怪的输出,即使代码所做的只是获取输入,然后将其吐出

#include <stdio.h>

int y;
int z;
int i;
int n;
int r;
int c;
float e;
float d;

void main() {
    puts("Enter Row Number:");
    scanf("%i", &r);
    puts("Enter Column Number:");
    scanf("%i", &c);
    float x[r][c];
    int j = r;

    for(y = 1; y <= r; y++) {
        for(z = 1; z <= c; z++) {
            scanf("%f", &x[y][z]);
        }
    }
    for (y = 1; y <= r; y++) {
        for(z = 1; z <= c; z++) {
            printf("%g\t", x[y][z]);
        }
        puts("\n");
    }
}
#包括
int-y;
intz;
int i;
int n;
INTR;
INTC;
浮子e;
浮动d;
void main(){
puts(“输入行号:”);
scanf(“%i”、&r);
puts(“输入列号:”);
scanf(“%i”、&c);
浮动x[r][c];
int j=r;

对于(y=1;y
scanf%f
需要一个
float
地址。使用
scanf
直接将数据读取到一个非本地变量是危险的,因为很难看出它实际上不是
float
。我将以这种方式更改代码,使其更加健壮:

float temp;
scanf("%f", &temp);
x[y][x] = temp;
您的循环是错误的:

for(y = 1; y <= r; y++) {
    for(z = 1; z <= c; z++) {
数组的索引从零变为大小减一。因此
y
数组的
x
限制为

x[0]  /* first sub-array */
x[r - 1]  /* last sub-array */
将循环更改为

for(y = 0; y < r; y++) {
    for(z = 0; z < c; z++) {
(y=0;y{ 对于(z=0;z

请注意,它们现在从零开始,并使用小于比较运算符。

如果使用double,则在定义类似
x[r][c]的数组时,需要使用
%lf
读取输入
,该数组中的有效索引是
0
r-1
0
c-1
。我很惊讶您的代码没有生成分段错误,因为您是从1…r(数据结构的大小)进行迭代的在C中,数组和矩阵的编号为0…r-1我认为它不会产生分段错误,因为分段数比单个浮点数大得多。在某些调试环境(如Microsoft Visual C)中,它会触发错误,因为它会在每个数组后留出额外的空间来查看此类错误。但在一般情况下,每个数组都不会C编译器。这是NHAHDH所说的。我不知道scanf需要一个不同的双精度参数。Jerry和Hernan,虽然你们两人都是正确的,但我以前注意到,出于某种原因,它似乎不会产生任何错误或引起任何问题,所以我只是简单地将其保留。邋遢,我知道。谢谢你们的帮助,我会回答我自己的问题当我可以的时候
for(y = 0; y < r; y++) {
    for(z = 0; z < c; z++) {