首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 两则C语言技巧 [已结贴,结贴人:aoyunbaobei]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:24:57 楼主
    以前用C++时,喜欢去玩一些语法上的技巧,每学到一个技巧都高兴得不得了,总是想找个地方用它,以显示自己的水平。其实我们应该更关心技巧的实用价值,如果一项技巧很巧妙,但很少用它,忘掉了也不必觉得可惜。最近发现两则C语言技巧,以前没有用过,觉得有些实用价值,做个笔记吧。



    1.        数组初始化。

    常见的数组初始化方法:

    int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};




    通常情况下,这种做法没有问题。再看看下面这个例子:

        enum

        {

            FRUIT_APPLE,

            FRUIT_PEAR,

            FRUIT_BANANA,

            FRUIT_NR

        };



        int price[FRUIT_NR] = {20, 25, 30};




    这段代码有个潜在前提,那就是枚举的顺序不能变化。一旦变化,整个逻辑都乱了,这样的BUG能否查出来要靠运气。这样的假设是靠不住的,特别是当枚举是第三方库提供的时候,他们调整枚举的顺序后绝对不会通知你。为了避免这样的潜在隐患,可以用下面的方法:

        Enum

        {

            FRUIT_APPLE,

            FRUIT_PEAR,

            FRUIT_BANANA,

            FRUIT_NR

        };



        int price[FRUIT_NR] = { [FRUIT_APPLE] = 20, [FRUIT_PEAR] = 25, [FRUIT_BANANA] = 30};






    2.        处理case语句。

    处理case语句,有很多case情况要做相同的处理时,通常的做法是:

        switch(value)

        {

            case 0:

            case 1:

            case 2:

            case 3:

            case 4:

            case 5:

            case 6:

            case 7:

            case 8:

            case 9:

            {

                printf("ok\n");

                break;

            }

            default:break;

        }




    这样写当然没有错,只是比较繁琐,特别是这样情况很多时。如果这些值是连续的,我们可以用下面的方法:

        switch(value)

        {

            case 0 ... 9:

            {

                printf("ok\n");

                break;

            }

            default:break;

        }






    这两个技巧好像是属于C语言新标准的,我只是在gcc上测试过,不能保证可移植性。

    转自:http://blog.csdn.net/absurd/
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:25:281楼 得分:2
    楼主强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:40:552楼 得分:2
    引用 1 楼 baihacker 的回复:
    楼主强


    的确!还是谢谢了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:41:343楼 得分:2


    嗯, 如行云流水.


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:48:464楼 得分:2
    第二条平时常用,第一条不知道
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bubu8633
    • 等级:
    发表于:2008-05-09 15:50:275楼 得分:2
    这样写当然没有错,只是比较繁琐,特别是这样情况很多时。如果这些值是连续的,我们可以用下面的方法:

        switch(value)

        {

            case 0 ... 9:

            {

                printf("ok\n");

                break;

            }

            default:break;

        }

    这个不错 ,以前不晓得
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:57:186楼 得分:2
    第二个。。。
    如果项目数比较少的话,为啥直接用if判断了事呢?代码似乎简单不少,只是不便于修改
    如果项目数比较多的话,我觉得一般不会出现这样的连续情况,比如常用的WinProc。。。
    不过确实很技巧,收着。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:57:417楼 得分:2
    学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:58:238楼 得分:2
    第二种,delphi上就是这样用的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 15:59:319楼 得分:2
    c99的~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:01:5810楼 得分:2
    第二个技巧没有试过,试试看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:08:0011楼 得分:2
    不错的做法,长见识了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:12:3112楼 得分:2
    老师常常教导我们学习要养成良好的习惯  支持楼主
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:13:1013楼 得分:1
    收藏了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:16:0314楼 得分:1
    引用 1 楼 baihacker 的回复:
    楼主强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:36:0915楼 得分:1
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:43:0816楼 得分:0
    C/C++ code
    Enum { FRUIT_APPLE, FRUIT_PEAR, FRUIT_BANANA, FRUIT_NR }; int price[FRUIT_NR] = { [FRUIT_APPLE] = 20, [FRUIT_PEAR] = 25, [FRUIT_BANANA] = 30};

    VS25005编译不通过
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 20:52:2017楼 得分:1
    引用 5 楼 bubu8633 的回复:
    这样写当然没有错,只是比较繁琐,特别是这样情况很多时。如果这些值是连续的,我们可以用下面的方法: 

        switch(value) 

        { 

            case 0 ... 9: 

            { 

                printf("ok\n"); 

                break; 

            } 

            default:break; 

        } 

    这个不错 ,以前不晓得
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 21:12:2818楼 得分:1
    引用 1 楼 baihacker 的回复:
    楼主强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 21:23:2519楼 得分:1
    MARK.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 00:21:1420楼 得分:1
    见过第二种写法。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 00:26:3421楼 得分:1
    第二条到是常用,这样给我们很多方便。呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 01:26:4622楼 得分:1
    增加知识了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 01:34:4923楼 得分:1
    "case 0 ... 9: "

    0到9之间是用什么隔开的呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:57:1324楼 得分:1
    收藏
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 11:08:3025楼 得分:1
    说的都很不错,经验啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:01:2026楼 得分:1
    引用 23 楼 skran 的回复:
    "case 0 ... 9: "

    0到9之间是用什么隔开的呢?

    是“空格...空格”
    我一开始用的“...”编译不通过……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:08:2027楼 得分:1
    switch(value)

        {

            case 0 ... 9:

            {

                printf("ok\n");

                break;

            }

            default:break;

        }


    我在Turbo C 中测试怎么出现错误
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 13:26:3428楼 得分:1
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 13:38:4729楼 得分:0
    不过第一个没明白是什么意思?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 13:41:1130楼 得分:1
    http://topic.csdn.net/u/20080321/16/13a14f31-f736-41e1-bed8-ed39e818728a.html
    "结构体可以这样初始化?"

    又一例C99的新特性,很强大。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 13:56:1331楼 得分:0
    C/C++ code
    E:\DSLearning\Yao-Code-08-05-10\SkillsOnC.c(12) : error C2143: syntax error : missing ':' before '...' E:\DSLearning\Yao-Code-08-05-10\SkillsOnC.c(12) : error C2143: syntax error : missing ';' before '...' E:\DSLearning\Yao-Code-08-05-10\SkillsOnC.c(22) : error C2047: illegal default E:\DSLearning\Yao-Code-08-05-10\SkillsOnC.c(22) : error C2043: illegal break E:\DSLearning\Yao-Code-08-05-10\SkillsOnC.c(27) : error C2059: syntax error : '}'


    vc6报错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 15:47:1632楼 得分:1
    学到了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 21:39:3233楼 得分:1
    看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 15:18:5234楼 得分:0
    引用 1 楼 baihacker 的回复:
    楼主强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天