你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C进阶技巧——逗号表达式

[复制链接]
gaosmile 发布时间:2020-7-9 12:14
1、先来一个逗号表达式例子
一个逗号表达式的实例:
1#include <stdio.h>
2#include <stdlib.h>
3/******************************************
4 * Fuction: Main
5 * Descir : 测试一个逗号表达式
6 * Author :(公众号:最后一个bug)
7 *****************************************/
8int main(int argc, char *argv[]) {
9    int Val = 1;
10
11    Val = ++Val,Val+10,Val*10; //逗号表达式
12
13    printf("Val = %d",Val);
14
15    return 0;
16}

分析一下:
    大家首先可以自己算一下最后输出的结果,然后再去看下面的答案,其实对于逗号表达式的语法规则并不是很难,主要是大家在平时的开发中使用得比较少,一旦经常不使用就容易淡忘。

    逗号表达式的形式 : 表达式1,表达式2,......,表达式n
三点搞定:
  • 逗号表达式从表达式1开始顺序从左向右执行;
  • 其逗号表达式最后的值为最后一个表达式的值;
  • 逗号运算的优先级最低,也就说明与其他运算符结合使用的时候,在没有括号的情况下逗号运算符最后才执行。

上面例子的结果:
微信图片_20200709121044.png
    可能有部分小伙伴算出的结果是10,主要是没有考虑其逗号表达式优先级最低,所以第一赋值表达式优先执行。

2、"不怎么用"是不是就"没有用?

    既然大家平时都用得不多,是不是这个逗号表达式就是多此一举呢 ? C发展这么多年,如果真的没有价值估计早就不存在了吧,所以还是要秉承着"存在即是合理"的态度看待逗号表达式。
   
微信图片_20200709121049.png

    大家在平时阅读代码的时候应该都是按照从左至右,然后从上至下来的方式吧。基本上一个分号结束一行的书写,由于电脑屏幕的限制,有效代码暴露在人的视野中是有限的,同时人瞬间记忆时间也是有限的,如果在一个小小的屏幕上阅码势必会阻碍程序员的阅读和理解,比如下面两种书写方式:

1/******************************************
2 * Fuction: 非逗号表达式书写
3 * Descir :
4 * Author :(公众号:最后一个bug)
5 *****************************************/
6if(IsOk())
7{
8    sOkProc();
9    return GetOkCode();
10}
11else
12{
13    sNoProc();
14    return GetNoCode();
15}
16/******************************************
17 * Fuction: 采用逗号表达式书写
18 * Descir :
19 * Author :(公众号:最后一个bug)
20 *****************************************/
21return (IsOk())?(sOkProc(),GetOkCode())sNoProc(),GetNoCode());
分析一下:
  • 上面是两种代码书写方式,第一种占据了多行,而第二种进占据一行,这样同样一个屏幕所容纳的有效代码第一种就明显少于第二种方式,所以很多程序员都会选择使用一种大长屏或者多屏进行开发。
  • 第二种方式似乎很多小伙伴觉得代码不够美观,也不便于维护,其实这仅仅只是一种习惯罢了,就好像编码的时候 : 第一个大括号是否需要另外起一行,或者是使用==号一定要像if( 1== b)这样把数据放左边,当你习惯了这种编码风格也会觉得用第二方式来得直接。

     
3、逗号表达式常用的地方

    下面为大家介绍几个用逗号表示式比较多的地方:
1、for循环中的处理
参考demo:
1#include <stdio.h>
2#include <stdlib.h>
3#define  ROW_NUM  (5)
4#define  LINE_NUM (5)
5/******************************************
6 * Fuction: Main
7 * Descir :for 遍历查找
8 * Author :(公众号:最后一个bug)
9 *****************************************/
10int main(int argc, char *argv[]) {
11    int i = 0,j = 0;
12    int Matrix[ROW_NUM][LINE_NUM] ={{1,1,1,1,1},\
13                                    {2,2,2,2,2},\
14                                    {3,3,3,3,3},\
15                                    {4,4,4,4,4},\
16                                    {5,5,5,5,5},\
17                                    };
18
19    for(i = 0,j = 0;(i < ROW_NUM)&&(j < LINE_NUM);i++,j += 2)
20    {
21         printf("Matrix[%d][%d] = %d\n",i,j,Matrix[j]);
22    }
23    printf("公众号:最后一个bug\n");
24    return 0;
25}
分析一下:
  • 上面在for循环中遍历相关数据几比较常规的处理,也是逗号表达式经常出现的地方,这样的表现形式让代码更加简单明了。
  • 其结果如下:

微信图片_20200709121055.png

2、弱化++处理
    大家应该都知道++在前先执行自加,然后再进行相应处理,而++在后则相反,那么我们可以使用逗号运算符优先级最低的特点来弱化该问题,避免编码出现bug。
参考Demo
1#include <stdio.h>
2#include <stdlib.h>
3/******************************************
4 * Fuction: Main
5 * Descir :弱化++前后问题
6 * Author :(公众号:最后一个bug)
7 *****************************************/
8int main(int argc, char *argv[]) {
9    int i = 0;
10
11    //1、常规操作
12    i = 0;
13    while(++i < 3)
14    {
15        printf(" i = %d\n",i);
16    }
17    printf("*****************\n");
18
19    i = 0;
20    while(i++ < 3)
21    {
22        printf(" i = %d\n",i);
23    }
24    printf("*****************\n");
25
26    //2、逗号表达式处理一下
27    i = 0;
28    while( i++,i < 3)
29    {
30        printf(" i = %d\n",i);
31    }
32    printf("*****************\n");
33
34    i = 0;
35    while( ++i,i < 3)
36    {
37        printf(" i = %d\n",i);
38    }
39    printf("*****************\n");
40
41    printf("公众号:最后一个bug\n");
42    return 0;
43}
44
分析一下:
  • 当使用逗号表达式以后,不管++在前还是在后,其都会自增加1,然后再进行右边表达式的处理,这样就不用担心是不是多记了一次,导致各种问题。
  • 运行结果:


微信图片_20200709121059.png


3、更加精简宏定义
参考demo
1#include <stdio.h>
2#include <stdlib.h>
3
4#define  GET_INDEX(a ,b)  ( a+= 2,a + b)
5/******************************************
6 * Fuction: Main
7 * Descir : 简化宏
8 * Author :(公众号:最后一个bug)
9 *****************************************/
10int main(int argc, char *argv[]) {
11    int i = 0,Val = 0;
12    int Param1 = 0, Param2 = 0;
13    int Matrix[5] ={5,5,5,5,5};
14
15    printf(" Matrix = %d\n",Matrix[GET_INDEX(Param1,Param2)]);
16    printf("公众号:最后一个bug\n");
17    return 0;
18}

分析一下:
  • 逗号表达式最终还是一个表达式,所以它可以直接用在几乎所有变量可以用的地方,这是和语句不同的。
  • 所以逗号表达式左边的表达式可以预先进行各种处理,其最右边的表达式相当于返回最后的结果,从而减少函数的封装和调用。


4、最后小结

    逗号表达式其实就是横向编码的一种方式,能够让程序员更好的利用一行的空间,使得代码更加紧凑,所以使用逗号表达式并没炫技,而是增强了代码的灵活度,不过话说回来逗号表达式在C混乱编码大赛上的使用频度是非常之高的。

收藏 评论1 发布时间:2020-7-9 12:14

举报

1个回答
乐天乐 回答时间:2020-7-9 13:48:06
小小的逗号用处很奇妙

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版