| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1274 人关注过本帖
标题:C语言怪题
只看楼主 加入收藏
playmyself
Rank: 5Rank: 5
来 自:第3系4级宇宙空间
等 级:职业侠客
帖 子:76
专家分:399
注 册:2009-7-8
结帖率:100%
收藏
已结贴  问题点数:25 回复次数:12 
C语言怪题
程序代码:
#include<stdio.h>

#define BASE_ONE (sizeof(array) / sizeof(array[0]))
int array[] = {14278,285714,428571,571428,714285,857142};
int main() 
{
    int d;
    for(d=-1;d <= (BASE_ONE-2);d++)
        printf("%d\n",array[d+1]);
    return 0; 
}
上面的程序哪里错了呢?
if(解释正确 && 回贴靠前)
    得分~!;
搜索更多相关主题的帖子: C语言 
2010-04-01 22:08
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
285714,428571,571428,714285,857142

运行环境?

想象力征服世界
2010-04-01 22:17
playmyself
Rank: 5Rank: 5
来 自:第3系4级宇宙空间
等 级:职业侠客
帖 子:76
专家分:399
注 册:2009-7-8
收藏
得分:0 
以下是引用longlong89在2010-4-1 22:17:15的发言:

285714,428571,571428,714285,857142
 
运行环境?
符合ANSI C89,C99均可,例如C-FREE,VS2008,GCC。。。。。。

无聊创造奇迹。
2010-04-01 22:21
shanshuilanr
Rank: 2
等 级:论坛游民
帖 子:7
专家分:23
注 册:2010-3-27
收藏
得分:1 
如果你是用负数的话,它的存储方式是反码,当然不可以了,个人意见,
2010-04-01 22:38
playmyself
Rank: 5Rank: 5
来 自:第3系4级宇宙空间
等 级:职业侠客
帖 子:76
专家分:399
注 册:2009-7-8
收藏
得分:0 
以下是引用shanshuilanr在2010-4-1 22:38:00的发言:

如果你是用负数的话,它的存储方式是反码,当然不可以了,个人意见,
算没解释清楚,真遗憾,负数存储方式确实是正数反码再加一,但为啥不可以呐?要把当然也解释的清楚。

无聊创造奇迹。
2010-04-01 22:46
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:1 
主要是浮点数(BASE_ONE)与整数相减( 2 ) 运算出现的故障,具体原因等待解答.将程序改为下面即可:

程序代码:
#include<stdio.h>
#include<stdlib.h>
#define BASE_ONE (sizeof(array) / sizeof(array[0]))
int array[] = {14278,285714,428571,571428,714285,857142};
int main()
{
    int d;

    for(d=-1;d <= (BASE_ONE-2.0);d++)
        printf("%d\n",array[d+1]);
    return 0;
}
2010-04-01 23:12
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1481
专家分:9055
注 册:2010-3-16
收藏
得分:0 
bcc+editplus运行结果:

14278
285714
428571
571428
714285
857142
请按任意键继续. . .
2010-04-02 00:16
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:23 
这个问题是数据类型导致的,sizeof 返回来的值通常是size_t,而大多数系统中size_t是这样定义的
typedef unsigned int size_t
它是一个无符号整型所以(BASE_ONE-2)的值是一个无符号整型,在语句d <= (BASE_ONE-2)中 因为右值为无符号整型,左值为有符号整型,所以左值被自动提升为无符号整型,-1被提升为无符号整型后值为无符号整型的最大值,d <= (BASE_ONE-2) 恒为假。
做一次强制类型转换就好了。

#include<stdio.h>
#include<stdlib.h>
#define BASE_ONE (sizeof(array) / sizeof(array[0]))
int array[] = {14278,285714,428571,571428,714285,857142};
int main()
{
    int d;
    for(d=-1;d <= (int)(BASE_ONE-2);d++)
        printf("%d\n",array[d+1]);
    return 0;
}


[ 本帖最后由 zhddragon 于 2010-4-2 00:21 编辑 ]

身体是玩命的本钱
2010-04-02 00:18
shanshuilanr
Rank: 2
等 级:论坛游民
帖 子:7
专家分:23
注 册:2010-3-27
收藏
得分:0 
楼上的真是高手啊,我今天刚想出来,准备贴,哎,莫道君行早 更有早行人!
2010-04-02 07:47
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:0 
以下是引用zhddragon在2010-4-2 00:18:39的发言:

这个问题是数据类型导致的,sizeof 返回来的值通常是size_t,而大多数系统中size_t是这样定义的
typedef unsigned int size_t
它是一个无符号整型所以(BASE_ONE-2)的值是一个无符号整型,在语句d <= (BASE_ONE-2)中 因为右值为无符号整型,左值为有符号整型,所以左值被自动提升为无符号整型,-1被提升为无符号整型后值为无符号整型的最大值,d <= (BASE_ONE-2) 恒为假。
做一次强制类型转换就好了。

#include
#include
#define BASE_ONE (sizeof(array) / sizeof(array[0]))
int array[] = {14278,285714,428571,571428,714285,857142};
int main()
{
    int d;
    for(d=-1;d <= (int)(BASE_ONE-2);d++)
        printf("%d\n",array[d+1]);
    return 0;
}
俺再鸡蛋里挑点骨头:
在语句d <= (BASE_ONE-2)中把d称为左值,(BASE_ONE-2)称为右值的说法不妥,容易误导初学者。
左值l-value,右值r-value是赋值术语,不宜滥用。
在这里不妨称之为左操作数、右操作数更恰当一些。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-04-02 10:26
快速回复:C语言怪题
数据加载中...
 
   



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

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