免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1730 | 回复: 5
打印 上一主题 下一主题

关于枚举类型有些迷惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-16 15:38 |只看该作者 |倒序浏览
按理说,枚举类型定义后,该枚举变量的值应该只限与列举出来的值的范围,象我后面的代码应该只局限于:enDV = 0, envBVMV=1
可要是象下面那样定义一个枚举类型的二维数组的话,在第一次for循环实际打印的值却是我{}中赋予的值。所以在if判断时
会打印faild!但在后面的for循环中,打印出来的所有二维数组却又都不是enDV = 0就是envBVMV=1。
而在第三次for循环打印中却都是2。不清楚为什么三次for循环打印为什么有三种结果,请高手指点!

#include "stdio.h"
enum enBRV
{
    enDV = 0,

    envBVMV
};

main()
{
   int i,j;

   enum enBRV                    g_abyBSfC[ 8 ][ 3 ]
                                          =    {
                                                {0,2,3},   
                                                {1,2,3},   
                                                {2,2,3},   
                                                {3,2,3},   
                                                {4,2,3},   
                                                {5,2,3},   
                                                {6,2,3},   
                                                {7,2,3},   
                                            };




   if (g_abyBSfC[ 1 ][ 1 ] == enDV)
               printf("success!\n");
   else
               printf("faild!\n");
               
   for (i=0;i<8;i++)
   {   
       for (j=0;j<3;j++)
                printf("%d ",g_abyBSfC[ i ][ j ]);
   }            
   
   printf("\n");
   
   for (i=0;i<8;i++)
   {   
       for (j=0;j<3;j++)
           for (g_abyBSfC[ i ][ j ]=enDV;g_abyBSfC[ i ][ j ]<=envBVMV;g_abyBSfC[ i ][ j ]++)
                printf("%d ",g_abyBSfC[ i ][ j ]);
   }
   
   printf("\n");
   
   for (i=0;i<8;i++)
   {   
       for (j=0;j<3;j++)
                printf("%d ",g_abyBSfC[ i ][ j ]);
   }

}

打印结果:
faild!
0 2 3 1 2 3 2 2 3 3 2 3 4 2 3 5 2 3 6 2 3 7 2 3
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

[ 本帖最后由 miaoxins 于 2008-6-16 15:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-16 16:44 |只看该作者
gcc 2.95测试,同样的代码,c中可以通过,c++编译不能通过。说明c++类型检查比c要严格。

论坛徽章:
0
3 [报告]
发表于 2008-06-16 17:14 |只看该作者
枚举类型的变量不赋定义范围内值也是允许的,编译器不错这种检查

论坛徽章:
0
4 [报告]
发表于 2008-06-16 17:38 |只看该作者
你在第二次循环中又给数组重新赋值了,而且还不止一遍

for (g_abyBSfC[ i ][ j ]=enDV;g_abyBSfC[ i ][ j ]<=envBVMV;g_abyBSfC[ i ][ j ]++)

论坛徽章:
0
5 [报告]
发表于 2008-06-17 08:46 |只看该作者
如果不在第二个for中赋值的话,没办法回到枚举的情况。那如果把程序这样改,大家认为又会打印什么呢?

#include "stdio.h"
enum enBRV
{
    enDV = 0,

    envBVMV
};

main()
{
   int i,j;

   enum enBRV                    g_abyBSfC[ 8 ][ 3 ];

      
   printf("\n");
   
   for (i=0;i<8;i++)
   {   
       for (j=0;j<3;j++)
                printf("%d ",g_abyBSfC[ i ][ j ]);
   }

}

论坛徽章:
0
6 [报告]
发表于 2008-06-17 12:45 |只看该作者
三次for循环打印三种结果就是这个原因
那个循环就相当于:
int a;
for(a=0; a<=1; a++)
    printf("%d ", a);
输出 0 1
最后a的值是2

上面的朋友也说了,编译器不检查枚举类型究竟赋了什么值

[ 本帖最后由 weedeater 于 2008-6-17 12:46 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP