标题:在数组学习中发现的一个问题
只看楼主
andre116
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-4-8
结帖率:100%
已结贴  问题点数:10 回复次数:7 
在数组学习中发现的一个问题
各位好,在学习数组中发现一个问题。

下面实现给数组赋值,并打印出结果。  如下代码

#include <stdio.h>
#include<stdlib.h>

void main()
{
    int i, a[10];
    for (i = 0; i <= 9; )
    {
        a[i++] =2* i+1;        
        printf("%d \t", a[i]);   // 打印出来全是垃圾数值
    }
    getchar();

    for (i = 9; i >= 0; i--)
    {
        printf("%d \t", a[i]);    // 这次打印的都是正确的数值  a[i]=2*i+1
    }
    printf("\n %d \t %d", a[5], a[7]);
   
    system("pause");
}

为什么第一次打印都是垃圾值呢,在这里a[i++]=2*i+1  执行顺序到底是怎样的?

还望各位予以指导。

多谢!

搜索更多相关主题的帖子: include system 
2015-07-24 18:09
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
得分:0 
#include <stdio.h>
#include<stdlib.h>

void main()
{
    int i, a[10];
    for (i = 0; i <= 9; i++ )
    {
        a[i] =2* i+1;        
        printf("%d \t", a[i]);   // 打印出来全是垃圾数值
    }
    getchar();

    for (i = 9; i >= 0; i--)
    {
        printf("%d \t", a[i]);    // 这次打印的都是正确的数值  a[i]=2*i+1
    }
    printf("\n %d \t %d", a[5], a[7]);
   
    system("pause");
}
2015-07-24 18:16
andre116
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-4-8
得分:0 
感谢楼上。

其实我的问题是想知道 对于 数组赋值时,如果带自增运算符,执行顺序是怎样的?

如果一定要以 a[i++]的形式对数组赋值,该注意哪些问题?

多谢!

相信生活!
2015-07-24 19:02
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
得分:2 
回复 3楼 andre116
楼主可以设断点,观察代码的变化
#include <stdio.h>
#include<stdlib.h>

void main()
{
    int i, a[10];
    for (i = 0; i <= 9; i++ )     //设个断点
    {
        a[i] =2* i+1;             //设个断点
        printf("%d \t", a[i]);   // 设个断点
    }
    getchar();

    for (i = 9; i >= 0; i--)
    {
        printf("%d \t", a[i]);    // 这次打印的都是正确的数值  a[i]=2*i+1
    }
    printf("\n %d \t %d", a[5], a[7]);
   
    system("pause");
}
2015-07-24 19:20
w906414
Rank: 2
等 级:论坛游民
帖 子:75
专家分:76
注 册:2015-5-29
得分:4 
在第一个for循环最后加一个    printf("%d \t", a[i-1]);你就会发现执行的时候是先赋值a[i]=i*2+1,再执行i++的。
2015-07-24 20:23
yx1998
Rank: 2
等 级:论坛游民
威 望:1
帖 子:30
专家分:35
注 册:2015-7-24
得分:4 
for (i = 0; i <= 9; )
    {
        a[i++] =2* i+1;        
        printf("%d \t", a[i]);   // 打印出来全是垃圾数值
    }
给数组a赋值的i是增量之前的,但是打印的a【i】是增量之后,即未初始化的、

静心学习,远离浮躁。
2015-07-24 22:13
andre116
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-4-8
得分:0 
感谢4,5,6楼的朋友,你们说的没错。

按照插入断点的方法找寻,确实发现问题出在printf("%d \t", a[i]);这句上

这句中在循环末尾i已经变为10,在数组中已经超出其数组范围,故反馈的是未初始化的。而且从结果中还看出,系统将这个i=10所定位的内存地址作为了该数组的首位地址,所以后面输出的数字全是垃圾数据。

也将此信息共享。 感谢大家的讨论。

多谢!

相信生活!
2015-07-25 00:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你根本就没看书上++、--算符的讲授。

授人以渔,不授人以鱼。
2015-07-25 13:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-455742-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.110941 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved