|
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 三点搞定:
上面例子的结果:
可能有部分小伙伴算出的结果是10,主要是没有考虑其逗号表达式优先级最低,所以第一赋值表达式优先执行。 2、"不怎么用"是不是就"没有用? 既然大家平时都用得不多,是不是这个逗号表达式就是多此一举呢 ? C发展这么多年,如果真的没有价值估计早就不存在了吧,所以还是要秉承着"存在即是合理"的态度看待逗号表达式。
大家在平时阅读代码的时候应该都是按照从左至右,然后从上至下来的方式吧。基本上一个分号结束一行的书写,由于电脑屏幕的限制,有效代码暴露在人的视野中是有限的,同时人瞬间记忆时间也是有限的,如果在一个小小的屏幕上阅码势必会阻碍程序员的阅读和理解,比如下面两种书写方式: 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());分析一下:
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} 分析一下:
大家应该都知道++在前先执行自加,然后再进行相应处理,而++在后则相反,那么我们可以使用逗号运算符优先级最低的特点来弱化该问题,避免编码出现bug。 参考Demo1#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 分析一下:
参考demo1#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混乱编码大赛上的使用频度是非常之高的。 |
| 小小的逗号用处很奇妙 |
微信公众号
手机版