for循环中计数器的奇怪行为

时间:2014-10-26 18:29:27

标签: c

我注意到for循环的计数器(a变量)效果不佳。 实际上,计数器没有正确递减;我知道这个问题似乎很愚蠢,但我无法理解为什么a变量会这样做。

#include <stdio.h>

int main() {
    int a,i,b,matrice[2][2];
    printf("Put inside the matrix some numbers..\n");


    for (a=2;a>=0;a--) {
        for (b=2;b>=0;b--) {
            matrice[a][b]=scanf("%d",&i);
        }
    }

    return 0;
}

6 个答案:

答案 0 :(得分:1)

如果你试图将数字读入矩阵,那么这就是你应该做的......

for (a=1;a>=0;a--) {
    for (b=1;b>=0;b--) {
        scanf("%d",&matrice[a][b]);
    }

由于数组matrice[2][2]包含2*2个元素,因此有效索引为01
这就是for循环应该从1而不是2

开始的原因

答案 1 :(得分:1)

当你读入你的数组时,你将超出界限。

for (a=2;a>=0;a--) {

Array只有两个元素,但是你尝试在第一次迭代时读入第三个元素。

matrice[2]

是第三个要素。这两种维度都会发生。


scanf()调用不正确。它将值读入i,但它返回读取项的数量,而不是i的值。

答案 2 :(得分:0)

您的矩阵的大小为[2][2],但您使用的循环次数为2到0(含)。在大小为2的数组中,最大允许索引为1.

答案 3 :(得分:0)

1)数组索引从0开始,根据您的代码,它将访问matrice[2][2],这将导致未定义的行为

2)matrice[a][b]=scanf("%d",&i);会将scanf的返回值存储在matrice[a][b]中。


#include <stdio.h>

int main() {
    int a,b,matrice[2][2];
    printf("Put inside the matrix some numbers..\n");


    for (a=1;a>=0;a--) 
    {
        for (b=1;b>=0;b--) 
        {
            scanf("%d",&matrice[a][b]);
        }
    }
    //Then print or do other operations on matrice
    return 0;
}

答案 4 :(得分:0)

你开始出界了。

对于大小为n的数组,您从0迭代到n-1

所以你想要的是

for (a=1;a>=0;a--){
    for (b=1;b>=0;b--){

    }
}

但是有一个警告的话,用for循环向后跑。你是好的,因为你使用整数,但如果你要做这样的事情

for (auto i = some_vector.size()-1;i>=0;i--){

}

你会遇到很多麻烦,因为some_vector.size()类型为unsigned,因此无法取负值,因此循环永远不会退出。除非逻辑另有规定,否则我倾向于总是在循环中递增。

答案 5 :(得分:0)

我想你只是在学习基本的东西..所以试着运行这个稍微版本的代码:

#include <stdio.h>

int main() {
    int a,i,b,matrice[2][2];
    printf("Put inside the matrix some numbers..\n");

    for (a=1;a>=0;a--) {
        printf("a->%d\n", a);
        for (b=1;b>=0;b--) {
            printf(" b->%d\n", b);
            scanf("%d",&matrice[a][b]);
        }
    }

    printf("Check:\n");
    for (a=1;a>=0;a--) {
        for (b=1;b>=0;b--) {
            printf(" [%d][%d]:%d\n", a, b, matrice[a][b]);
        }
    }  

    return 0;
}

在第一个循环中,修改后的代码运行正确的索引,对于2x2数组,它们是(0,0),(0,1),(1,0)和(1,1)。 请注意,我还使用正确的语法修改了scanf部分:link

第二个循环是一个简单的测试,它通过输出矩阵的内容来正确编码数据插入的内容。