當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]1、先來一個(gè)逗號(hào)表達(dá)式例子 一個(gè)逗號(hào)表達(dá)式的實(shí)例: 1#include? 2#include? 3/****************************************** 4?*?Fuction:?Main? 5?*?Descir?:?測(cè)試一個(gè)逗號(hào)表達(dá)式? 6?*?Author?:(公眾號(hào):最后一個(gè)bug)? 7?***************


1、先來一個(gè)逗號(hào)表達(dá)式例子

一個(gè)逗號(hào)表達(dá)式的實(shí)例:
 1#include <stdio.h>
2#include <stdlib.h>
3/******************************************
4 * Fuction: Main 
5 * Descir : 測(cè)試一個(gè)逗號(hào)表達(dá)式 
6 * Author :(公眾號(hào):最后一個(gè)bug) 
7 *****************************************/
 
8int main(int argc, char *argv[]) {
9    int Val = 1;
10
11    Val = ++Val,Val+10,Val*10//逗號(hào)表達(dá)式 
12
13    printf("Val = %d",Val);
14
15    return 0;
16}
分析一下:

    大家首先可以自己算一下最后輸出的結(jié)果,然后再去看下面的答案,其實(shí)對(duì)于逗號(hào)表達(dá)式的語法規(guī)則并不是很難,主要是大家在平時(shí)的開發(fā)中使用得比較少,一旦經(jīng)常不使用就容易淡忘。


    逗號(hào)表達(dá)式的形式 : 表達(dá)式1,表達(dá)式2,......,表達(dá)式n

三點(diǎn)搞定:
  • 逗號(hào)表達(dá)式從表達(dá)式1開始順序從左向右執(zhí)行;

  • 其逗號(hào)表達(dá)式最后的值為最后一個(gè)表達(dá)式的值;

  • 逗號(hào)運(yùn)算的優(yōu)先級(jí)最低,也就說明與其他運(yùn)算符結(jié)合使用的時(shí)候,在沒有括號(hào)的情況下逗號(hào)運(yùn)算符最后才執(zhí)行。

上面例子的結(jié)果:

    可能有部分小伙伴算出的結(jié)果是10,主要是沒有考慮其逗號(hào)表達(dá)式優(yōu)先級(jí)最低,所以第一賦值表達(dá)式優(yōu)先執(zhí)行。


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


    既然大家平時(shí)都用得不多,是不是這個(gè)逗號(hào)表達(dá)式就是多此一舉呢 ? C發(fā)展這么多年,如果真的沒有價(jià)值估計(jì)早就不存在了吧,所以還是要秉承著"存在即是合理"的態(tài)度看待逗號(hào)表達(dá)式。

    


    大家在平時(shí)閱讀代碼的時(shí)候應(yīng)該都是按照從左至右,然后從上至下來的方式吧?;旧弦粋€(gè)分號(hào)結(jié)束一行的書寫,由于電腦屏幕的限制,有效代碼暴露在人的視野中是有限的,同時(shí)人瞬間記憶時(shí)間也是有限的,如果在一個(gè)小小的屏幕上閱碼勢(shì)必會(huì)阻礙程序員的閱讀和理解,比如下面兩種書寫方式:


 1/******************************************
2 * Fuction: 非逗號(hào)表達(dá)式書寫 
3 * Descir : 
4 * Author :(公眾號(hào):最后一個(gè)bug) 
5 *****************************************/
 
6if(IsOk())
7{
8    sOkProc();
9    return GetOkCode(); 
10
11else
12{
13    sNoProc();
14    return GetNoCode(); 
15}
16/******************************************
17 * Fuction: 采用逗號(hào)表達(dá)式書寫 
18 * Descir : 
19 * Author :(公眾號(hào):最后一個(gè)bug) 
20 *****************************************/
 
21return (IsOk())?(sOkProc(),GetOkCode()):(sNoProc(),GetNoCode());
分析一下:
  • 上面是兩種代碼書寫方式,第一種占據(jù)了多行,而第二種進(jìn)占據(jù)一行,這樣同樣一個(gè)屏幕所容納的有效代碼第一種就明顯少于第二種方式,所以很多程序員都會(huì)選擇使用一種大長(zhǎng)屏或者多屏進(jìn)行開發(fā)。

  • 第二種方式似乎很多小伙伴覺得代碼不夠美觀,也不便于維護(hù),其實(shí)這僅僅只是一種習(xí)慣罷了,就好像編碼的時(shí)候 : 第一個(gè)大括號(hào)是否需要另外起一行,或者是使用==號(hào)一定要像if( 1== b)這樣把數(shù)據(jù)放左邊,當(dāng)你習(xí)慣了這種編碼風(fēng)格也會(huì)覺得用第二方式來得直接。

     

3、逗號(hào)表達(dá)式常用的地方


    下面為大家介紹幾個(gè)用逗號(hào)表示式比較多的地方:

1、for循環(huán)中的處理
參考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 :(公眾號(hào):最后一個(gè)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[i][j]);
22    }
23    printf("公眾號(hào):最后一個(gè)bug\n");
24    return 0;
25}
分析一下:
  • 上面在for循環(huán)中遍歷相關(guān)數(shù)據(jù)幾比較常規(guī)的處理,也是逗號(hào)表達(dá)式經(jīng)常出現(xiàn)的地方,這樣的表現(xiàn)形式讓代碼更加簡(jiǎn)單明了。

  • 其結(jié)果如下:


2、弱化++處理

    大家應(yīng)該都知道++在前先執(zhí)行自加,然后再進(jìn)行相應(yīng)處理,而++在后則相反,那么我們可以使用逗號(hào)運(yùn)算符優(yōu)先級(jí)最低的特點(diǎn)來弱化該問題,避免編碼出現(xiàn)bug。

參考Demo
 1#include <stdio.h>
2#include <stdlib.h>
3/******************************************
4 * Fuction: Main 
5 * Descir :弱化++前后問題 
6 * Author :(公眾號(hào):最后一個(gè)bug) 
7 *****************************************/
 
8int main(int argc, char *argv[]) {
9    int i = 0;
10
11    //1、常規(guī)操作
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、逗號(hào)表達(dá)式處理一下
27    i = 0;
28    whilei++,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("公眾號(hào):最后一個(gè)bug\n");
42    return 0;
43}
44
分析一下:
  • 當(dāng)使用逗號(hào)表達(dá)式以后,不管++在前還是在后,其都會(huì)自增加1,然后再進(jìn)行右邊表達(dá)式的處理,這樣就不用擔(dān)心是不是多記了一次,導(dǎo)致各種問題。

  • 運(yùn)行結(jié)果:




3、更加精簡(jiǎn)宏定義
參考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 : 簡(jiǎn)化宏 
8 * Author :(公眾號(hào):最后一個(gè)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("公眾號(hào):最后一個(gè)bug\n");
17    return 0;
18}
分析一下:
  • 逗號(hào)表達(dá)式最終還是一個(gè)表達(dá)式,所以它可以直接用在幾乎所有變量可以用的地方,這是和語句不同的。

  • 所以逗號(hào)表達(dá)式左邊的表達(dá)式可以預(yù)先進(jìn)行各種處理,其最右邊的表達(dá)式相當(dāng)于返回最后的結(jié)果,從而減少函數(shù)的封裝和調(diào)用。


4、最后小結(jié)


    逗號(hào)表達(dá)式其實(shí)就是橫向編碼的一種方式,能夠讓程序員更好的利用一行的空間,使得代碼更加緊湊,所以使用逗號(hào)表達(dá)式并沒炫技,而是增強(qiáng)了代碼的靈活度,不過話說回來逗號(hào)表達(dá)式在C混亂編碼大賽上的使用頻度是非常之高的。


本文授權(quán)轉(zhuǎn)載自公眾號(hào)“最后一個(gè)bug”,作者未知bug


-END-




推薦閱讀



【01】為什么要使用二級(jí)指針?
【02】指針和引用有什么區(qū)別?分別什么時(shí)候引用?
【03】“懸空指針”和“野指針”究竟是什么意思?標(biāo)準(zhǔn)答案來了
【04】用指針實(shí)現(xiàn)高低位倒序,瘋了吧?
【05】再談指針:大佬給你撥開 C指針 的云霧


免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉