|
1、先来一个逗号表达式例子 一个逗号表达式的实例:1#include <stdio.h> 2#include <stdlib.h>, q* w, C/ v* e; d 3/******************************************) ~5 a( A) z8 G9 Q. ] 4 * Fuction: Main 7 T z6 q/ S$ w f+ m$ r+ ` 5 * Descir : 测试一个逗号表达式 b0 e% k6 [- C: f3 \# ?) t 6 * Author :(公众号:最后一个bug) # [0 t3 x$ D3 q: B# @! q7 `. Z$ z 7 *****************************************/ 8int main(int argc, char *argv[]) {/ c; V3 K2 ?" L6 {9 A$ m8 s 9 int Val = 1;+ F' h E7 z4 t 101 f, c) E2 G; F7 J7 i& N 11 Val = ++Val,Val+10,Val*10; //逗号表达式 12 13 printf("Val = %d",Val);* U# u: h' f. T 14 15 return 0;7 [6 m2 ?% u8 }4 _" t 16}0 D/ F1 y" }6 I0 H5 B 分析一下: 大家首先可以自己算一下最后输出的结果,然后再去看下面的答案,其实对于逗号表达式的语法规则并不是很难,主要是大家在平时的开发中使用得比较少,一旦经常不使用就容易淡忘。 * A! M$ Z- E1 |% }) q 逗号表达式的形式 : 表达式1,表达式2,......,表达式n 三点搞定:
上面例子的结果:
可能有部分小伙伴算出的结果是10,主要是没有考虑其逗号表达式优先级最低,所以第一赋值表达式优先执行。 2、"不怎么用"是不是就"没有用? 既然大家平时都用得不多,是不是这个逗号表达式就是多此一举呢 ? C发展这么多年,如果真的没有价值估计早就不存在了吧,所以还是要秉承着"存在即是合理"的态度看待逗号表达式。
' d$ k. T7 }2 a 大家在平时阅读代码的时候应该都是按照从左至右,然后从上至下来的方式吧。基本上一个分号结束一行的书写,由于电脑屏幕的限制,有效代码暴露在人的视野中是有限的,同时人瞬间记忆时间也是有限的,如果在一个小小的屏幕上阅码势必会阻碍程序员的阅读和理解,比如下面两种书写方式: 2 * Fuction: 非逗号表达式书写 ' T, U& z9 s" b$ G; v. u$ r% m! }* C 3 * Descir : 4 * Author :(公众号:最后一个bug) 5 *****************************************/ 6if(IsOk())8 L# G2 g9 p0 K' _$ i! q 7{ 8 sOkProc();- Q8 |/ @. v' [7 r9 a& L 9 return GetOkCode(); 10} ! ]/ K+ E9 u- m2 F& h" g 11else% @& Y3 b; D& }' f" J% P8 y 12{! @% B8 ~+ p/ p1 N 13 sNoProc(); 14 return GetNoCode(); & @$ R1 y: ~" k5 e( v 15} 16/******************************************; M0 |+ y' L3 Y3 d3 I 17 * Fuction: 采用逗号表达式书写 # Z+ k9 O+ K5 }) O% o2 |$ W 18 * Descir : 9 `; ]( P; `6 O' ]# P 19 * Author :(公众号:最后一个bug) S2 i' \* M" K) M* h8 l 20 *****************************************/ $ I) ]6 S# X# X8 M 21return (IsOk())?(sOkProc(),GetOkCode()) sNoProc(),GetNoCode());分析一下:
3、逗号表达式常用的地方 下面为大家介绍几个用逗号表示式比较多的地方: 1、for循环中的处理参考demo:1#include <stdio.h>6 G+ t3 ~$ e" s7 z 2#include <stdlib.h> 3#define ROW_NUM (5) 4#define LINE_NUM (5) 6 d& Y8 {1 K; u' _7 j0 z# g 5/******************************************$ N9 R1 c9 X$ M$ \) J& o! f6 X 6 * Fuction: Main 7 * Descir :for 遍历查找 # m* b) L! K' S5 u' c u 8 * Author :(公众号:最后一个bug) ( u% ?* X! T' R3 n. e9 [ 9 *****************************************/ 4 O7 b* O4 g! M' I% C# F 10int main(int argc, char *argv[]) { 11 int i = 0,j = 0; 12 int Matrix[ROW_NUM][LINE_NUM] ={{1,1,1,1,1},\6 P9 f5 z0 {1 x 13 {2,2,2,2,2},\ 14 {3,3,3,3,3},\7 f& S$ k3 k1 k5 G: e# E' [ 15 {4,4,4,4,4},\% x* D+ o2 L0 J: M2 ~% M 16 {5,5,5,5,5},\ 17 }; 185 J3 c7 k+ q. t% z( v6 a0 w 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>" u& v, c9 @$ w6 w$ ^2 B 2#include <stdlib.h>! \$ c1 E/ V# x* W. r* \) s8 K4 ] 3/****************************************** 4 * Fuction: Main 5 * Descir :弱化++前后问题 6 * Author :(公众号:最后一个bug) 5 ^) ]8 W2 x9 j- z 7 *****************************************/ 8int main(int argc, char *argv[]) { 9 int i = 0; 10 11 //1、常规操作+ p8 c9 m8 P, }8 F+ i 12 i = 0; 13 while(++i < 3)7 m$ x7 S C' J2 U, a 14 { 15 printf(" i = %d\n",i);2 C# O, p; h; c4 | 16 }* T2 g: s6 _2 o) @- G3 k v 17 printf("*****************\n");# Z$ m- J0 A8 n( L8 l8 E5 Y 18" ~( s3 z: |5 Y' {# I& O* ?( m 19 i = 0; 20 while(i++ < 3), \: a( {) u* b ] 21 { 22 printf(" i = %d\n",i); 23 } 24 printf("*****************\n");3 ~9 I8 `4 |9 j* v8 M 25 26 //2、逗号表达式处理一下 27 i = 0;+ e0 B6 c, C/ P 28 while( i++,i < 3) 29 { 30 printf(" i = %d\n",i); 31 }# ^' P7 F3 g4 u* M: | V+ | 32 printf("*****************\n"); 33 34 i = 0; 35 while( ++i,i < 3)6 {8 U H" I/ p2 E 36 { 37 printf(" i = %d\n",i);8 K* a% ^3 A/ {- a 38 } 39 printf("*****************\n");* j1 L+ D2 v1 S; L! o) B( X 401 H. \+ e+ [; ?$ v$ h% a: E2 P( o 41 printf("公众号:最后一个bug\n"); 42 return 0;9 F; L q& A; `, J% q 43} 44 分析一下:
. J; j% Z9 B+ s$ z4 V1 [, k p, G" F
, \% p; c7 z9 a- j2 r2 i& G9 e " j( ]- _# I0 F2 S' }) ? 3、更加精简宏定义参考demo1#include <stdio.h>5 F# X; a: N+ L- } 2#include <stdlib.h>8 _" T" J! s# A$ e$ X# l- v6 U 34 Z$ W! I7 I; j( Z 4#define GET_INDEX(a ,b) ( a+= 2,a + b) 5/****************************************** 6 * Fuction: Main 6 a9 K& a" R- t/ ? 7 * Descir : 简化宏 % z9 Z9 w3 K* R7 k+ H1 x 8 * Author :(公众号:最后一个bug) 7 ^8 n7 A5 _1 J; Z7 z. _* m7 A 9 *****************************************/ 3 c( y1 k; C% l4 U! ] 10int main(int argc, char *argv[]) {$ h8 J9 T* F$ `, ^: r6 m$ o 11 int i = 0,Val = 0;' L% Y# r2 [$ s7 { 12 int Param1 = 0, Param2 = 0;+ L; }, {( N7 p5 Y9 n7 ?% W 13 int Matrix[5] ={5,5,5,5,5}; ~' r$ H! E, @ 14 15 printf(" Matrix = %d\n",Matrix[GET_INDEX(Param1,Param2)]); 16 printf("公众号:最后一个bug\n"); 17 return 0; 18} 分析一下:
4、最后小结 逗号表达式其实就是横向编码的一种方式,能够让程序员更好的利用一行的空间,使得代码更加紧凑,所以使用逗号表达式并没炫技,而是增强了代码的灵活度,不过话说回来逗号表达式在C混乱编码大赛上的使用频度是非常之高的。 |
| 小小的逗号用处很奇妙 |
微信公众号
手机版