| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2007 人关注过本帖
标题:有个编程问题,以前没发现,在写一个程序中发现的
只看楼主 加入收藏
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:12 
有个编程问题,以前没发现,在写一个程序中发现的
举个简单的例子,看下面这个程序
#include <stdio.h>
main(void)
{
   int a[10] = {1,2,3,4,5,6,7,8};
   for (int i = 7; i >= 0; i--)
   {
      printf("%d ",a[i]);
   }
   return 0;
}
很简单的数组倒序输出,但是,把for循环中i的类型改成size_t 程序就会出错,想问问大神,为什么,正序输出int和size_t可以相互替换,而倒序输出就不可以
搜索更多相关主题的帖子: return include 
2015-12-29 15:47
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
谢谢好心人帮我解答一下,这个问题已经找很长时间了
2015-12-29 15:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
你这10个空间 只初始化了8个啊

DO IT YOURSELF !
2015-12-29 15:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
size_t 属于无符号类型,永远>=0

对于反向迭代器,永远用的都是下一个元素的地址,即
程序代码:
#include <stdio.h>

int main( void )
{
    const int a[] = { 1,2,3,4,5,6,7,8 };

    for( size_t i=sizeof(a)/sizeof(a[0]); i!=0; --i )
    {
        printf( "%d ", a[i-1] );
    }

    return 0;
}

2015-12-29 16:00
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
size_t是标准C库中定义的,应为unsigned int 所以说他和int可以互通用  是不正确的

DO IT YOURSELF !
2015-12-29 16:01
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 4楼 rjsp
能说的稍微明白点吗,不太理解,反向迭代器是什么东东
2015-12-29 16:04
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 5楼 wp231957
这个我明白,但是正序输出没问题,倒序就有问题
2015-12-29 16:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
回复 6楼 foxeer
能说的稍微明白点吗 不太理解 ------ 对于unsigned a;你给a赋何值可以让a小于0?
反向迭代器是什么东东 ------ 正向遍历 和 反向遍历 的区别

////////////////// 随便说说,看不懂也无所谓 //////////////////

C语言我不太清楚,但对于C++,一个n长的数组,仅有n+1个元素地址有效
即对于 int a[N]; 有n+1个有效地址 &a[0]、&a[1]、&a[2]、……、&a[n-1]、&a[n]
而 &a[-1] 和 &a[n+1] 都是无效的。

再看 for( int i=0; i<=7; ++i ) 这种表达,使用int本身就属于错误,我就不多说了,我只说起始0和结束7
它怎么表示一个空范围?用 for( int i=0; i<=-1; ++i ) 吗?理由上面讲过了,这不是正道(虽然在语法上不属于错误)
正道是 for( int i=0; i!=8; ++i ),表示空范围就是 for( int i=0; i!=0; ++i )

从上面可以看出,正向遍历需要用到 &a[0] 和 &a[8] (你就把它看成0和8也一样,一个用地址,一个用索引,不要在意形式)
那么方向遍历也至少需要这两个点
2015-12-29 16:21
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
size_t是无符号型,for (int i = 7; i >= 0; i--)   i--到0后,再减就翻转了,没有负数,所以会出现死循环和数组越界

总有那身价贱的人给作业贴回复完整的代码
2015-12-29 17:14
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
#include <stdio.h>
main(void)
{
   int a[10] = {1,2,3,4,5,6,7,8};
   for (size_t i = 7; i >= 0; i--)
   {
      printf("i=%u\n ", i);   //你把i打印出来,看i=0后,下一次等于几?
      printf("%d ",a[i]);
   }
   return 0;
}

总有那身价贱的人给作业贴回复完整的代码
2015-12-29 17:16
快速回复:有个编程问题,以前没发现,在写一个程序中发现的
数据加载中...
 
   



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

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