C語(yǔ)言的分支與循環(huán)

C語(yǔ)言的分支與循環(huán)

——TechZone(Harris)


如果說(shuō)我們之前寫(xiě)過(guò)的代碼都是“直男”,也就是說(shuō)不管三七二十一戴卜,一路走到黑逾条,那么今天我們就來(lái)見(jiàn)識(shí)下“多慮”型的還有“徘徊”型的代碼。(你沒(méi)有看錯(cuò)投剥,代碼不僅可以猶豫师脂,還可以徘徊)

不過(guò),在這之前江锨,我還是來(lái)介紹兩個(gè)之前就應(yīng)該講到的知識(shí)吃警,與下文可能關(guān)系不大,但是放哪兒講都差不多啄育。

字符(串)

我們其實(shí)已經(jīng)知道了C語(yǔ)言只有字符一種變量酌心,就是char,而并沒(méi)有像某些語(yǔ)言那樣規(guī)定字符串這種類型挑豌。但是谒府,是不是字符串在C語(yǔ)言里面就沒(méi)有呢?

其實(shí)不然浮毯,只不過(guò)沒(méi)有專屬的類型而已。

定義一個(gè)字符的的方法泰鸡,想必大家都已經(jīng)掌握了债蓝,就像下面這個(gè)例子一樣:

//Example 01
#include <stdio.h>
int main(void)
{
    char Letter;
    Letter = 'A';
    return 0;
}

這樣,我們就定義了一個(gè)叫Letter的字符變量,并且賦值為字符A盛龄。

那么字符串該如何定義呢饰迹?

//Example 02
#include <stdio.h>
int main(void)
{
    char String[8];
    String = {'T','e','c','h','Z','o','n','e'};
    printf("%s",String);
    return 0;
}

這樣芳誓,我們就定義了一個(gè)名字叫String的字符串,還讓它輸出到我們屏幕上了啊鸭。如果你了解過(guò)數(shù)組锹淌,就覺(jué)得這種方式很像數(shù)組對(duì)吧,這里提前告訴大家赠制,字符串就是一種數(shù)組赂摆。但是,如果你去執(zhí)行下這段代碼你就會(huì)發(fā)現(xiàn)問(wèn)題了钟些。輸出的TechZone后面烟号,還會(huì)跟著一些亂碼……

咦?我明明只定義了8個(gè)字符政恍,怎么還多出來(lái)這些鬼東西呢汪拥?

那么,我們來(lái)了解下C語(yǔ)言時(shí)如何處理字符串的篙耗。我們可以理解迫筑,字符串的長(zhǎng)度是有限的,而且長(zhǎng)度一旦確定宗弯,在其生命周期里就無(wú)法再次更改脯燃。那么,系統(tǒng)為了確保字符串是真的結(jié)束了罕伯,會(huì)在末尾加一個(gè)\0來(lái)表示字符串的結(jié)束曲伊。我們做如下的修改,就可以讓字符串正常工作了:

//Example 03
#include <stdio.h>
int main(void)
{
    char String[9];
    String = {'T','e','c','h','Z','o','n','e','\0'};
    printf("%s",String);
    return 0;
}

你可能會(huì)想了追他,這樣也太麻煩了吧坟募,要是我要輸入一句話,那得多少個(gè)引號(hào)逗號(hào)邑狸,最后還可能忘記加\0懈糯。你這是把程序員不當(dāng)人看?单雾?

當(dāng)然不會(huì)孟害。我們可以這樣定義:

//Example 04
#include <stdio.h>
int main(void)
{
    char String[];
    String = {"TechZone"};
    printf("%s",String);
    return 0;
}

看到了吧,是不是簡(jiǎn)單很多了嗅钻?而且后面還會(huì)自動(dòng)補(bǔ)上一個(gè)\0昭灵,簡(jiǎn)直就是高枕無(wú)憂了。

有人可能有意見(jiàn)了渐逃,說(shuō)你怎么不早點(diǎn)告訴我够掠,害得我差點(diǎn)不學(xué)了……

學(xué)習(xí)當(dāng)然得從學(xué)基礎(chǔ)的開(kāi)始啦,別打我茄菊,別打我……

強(qiáng)制類型轉(zhuǎn)換

操作數(shù)不同的情況下疯潭,大部分的運(yùn)算符中赊堪,都會(huì)將精度低的類型轉(zhuǎn)成精度高的類型,這樣做竖哩,其實(shí)也就是為了確保精度罷了哭廉。

但是有的時(shí)候,我們也許并不希望像系統(tǒng)那樣的轉(zhuǎn)換相叁,那么我們可以自己進(jìn)行強(qiáng)制轉(zhuǎn)換遵绰。

具體方法:(類型名稱)變量名或值

例如:

//Example 05
#include <stdio.h>
int main(void)
{
    int num;
    num = (float)5/9;
    printf("%d",num);
    return 0;
}

在這個(gè)例子中,我們將5這個(gè)整型轉(zhuǎn)化成了浮點(diǎn)型钝荡,那么為了確保精度街立,系統(tǒng)也會(huì)將后面的9也轉(zhuǎn)化成浮點(diǎn)型。那么這樣就可以輸出結(jié)果埠通,不然結(jié)果就是0(因?yàn)閮蓚€(gè)整型相除結(jié)果也會(huì)取整赎离,然鵝,強(qiáng)制取整的結(jié)果就是保留整數(shù)端辱,而不是四舍五入)梁剔。


分支(條件語(yǔ)句)

我們高中數(shù)學(xué)中,如果有學(xué)過(guò)程序框圖的同學(xué)舞蔽,應(yīng)該就還依稀記得程序的幾種結(jié)構(gòu)荣病,其中分支循環(huán)就是今天要談的兩大結(jié)構(gòu)。

首先我們來(lái)看看一些分支里面經(jīng)常使用的運(yùn)算符:

  1. 關(guān)系運(yùn)算符

    運(yùn)算符 優(yōu)先級(jí)
    <
    <=
    >
    >=
    ==
    !=
  2. 邏輯運(yùn)算符

    運(yùn)算符 優(yōu)先級(jí)
    ! (邏輯非)
    &&(邏輯與)
    || (邏輯或)

此外渗柿,在編譯器中个盆,所有的字符都被看成ASCII,因此ASCII字符之間運(yùn)算或者比較等等都是合法的朵栖。

短路求值

在C語(yǔ)言中颊亮,如果設(shè)置兩個(gè)表達(dá)式,在求出第一個(gè)式子即可判斷出結(jié)果的時(shí)候陨溅,系統(tǒng)就不會(huì)繼續(xù)求第二個(gè)式子终惑。這看上去是編譯器的一種算法的優(yōu)化,但是如果寫(xiě)代碼的時(shí)候不注意的話门扇,很有可能造成一些隱性的漏洞雹有,看下面的例子:

//Example 06
#include <stdio.h>
int main(void)
{
    int a = 3,b = 3;
    (a = 0) && (b = 5);
    printf("a=%d, b=%d\n",a,b);
    //==========================
    (a = 1) || (b = 5);
    printf("a=%d, b=%d\n",a,b);
    return 0;
}

如果你愿意自己嘗試的話,可以自己去環(huán)境里面試試臼寄,如果不愿意的話那直接看下面的結(jié)果:

//Consequence 06
a=0,b=3
a=1,b=3

如果沒(méi)有開(kāi)頭的那段解釋霸奕,我相信很多初學(xué)者都會(huì)很懵逼,怎么會(huì)這樣吉拳?

不著急质帅,我們來(lái)分析下代碼。

我們看看分割線上面的那部分,a和b都被初始化成了整型并且賦值為3临梗。在第一句邏輯判斷語(yǔ)句里面,是判斷的邏輯與稼跳,也就是說(shuō)盟庞,全真則真,一假全假汤善。那么在判斷數(shù)字的時(shí)候什猖,則默認(rèn)0為假,非0為真红淡。那么這句(a = 0) && (b = 5);前面不狮,a已經(jīng)被賦值為0,那么已經(jīng)為假了在旱,在邏輯與的情況下摇零,就算后面的條件再真,整體也是假的了桶蝎,這就是所謂的一假全假驻仅。那么,在判斷了第一個(gè)表達(dá)式之后登渣,就可以做出判斷結(jié)果噪服,那么后面的b=5不會(huì)被執(zhí)行。

同理胜茧,分割線下面的代碼也是一個(gè)道理粘优。只不過(guò)這里判斷變成了邏輯或。邏輯或的標(biāo)準(zhǔn)就是一真則真呻顽,全假才假雹顺。那么,前面的a=1芬位,系統(tǒng)發(fā)現(xiàn)无拗,欸,已經(jīng)是真了喲昧碉!那么馬上罷工英染,后面的b=5也就不予理會(huì)了。那么輸出的結(jié)果就是上面那樣了被饿,理解了吧四康?

我們現(xiàn)在單獨(dú)這樣講這個(gè)特性,貌似感覺(jué)看不出什么狭握,但是以后寫(xiě)代碼的時(shí)候其實(shí)要留意下短路求值闪金,因?yàn)檫@樣子可能就會(huì)造成你的程序里面有Bug,而且還相當(dāng)不好找!哎垦!

if語(yǔ)句

if語(yǔ)句實(shí)際上就是判斷條件囱嫩,若符合的就輸出。之所以叫它分支漏设,那是因?yàn)槿绻搅藯l件語(yǔ)句墨闲,那么這里面的代碼就不一定都能執(zhí)行了,而是看情況來(lái)郑口。也就是說(shuō)鸳碧,條件語(yǔ)句里面的部分代碼,可能你的程序跑完了都沒(méi)有沒(méi)用到犬性,因此就叫分支瞻离。

那么if語(yǔ)句的通式就像下面那樣

if (...)
{
    ...;
}
else if (...)//可選
{
    ...;
}
else if (...)//可選
{
    ...;
}
...;//else if可有多個(gè)
else //上述條件都不符合,則執(zhí)行這個(gè)語(yǔ)句乒裆,可選
{
    ...;
}

我想大家看里面的注釋就能夠大致明白的差不多了套利。其中if語(yǔ)句是必須的,其他的是可選的缸兔。else if則表示的是當(dāng)if的條件不符合的時(shí)候日裙,就會(huì)繼續(xù)判斷所有的else if,若有符合條件的就執(zhí)行后面的語(yǔ)句惰蜜,若都不符合就執(zhí)行else的語(yǔ)句昂拂。如果沒(méi)有else if而有else,那么當(dāng)if不符合的時(shí)候就執(zhí)行else后面的語(yǔ)句抛猖。若有else if沒(méi)有else格侯,則無(wú)符合條件的話不執(zhí)行任何語(yǔ)句。else if和else都沒(méi)有的話财著,那么if不符合的時(shí)候就啥都不干联四。

看下面的例子,我們來(lái)制作一個(gè)識(shí)別星期的程序并且給出建議:

//Example 07
#include <stdio.h>
int main(void)
{
    int Weekday;
    printf("輸入今天星期的數(shù)字:");
    scanf("%d",&Weekday);//此處用于獲取用戶輸入的內(nèi)容并賦值給Weekday
    if (Weekday >= 1 && WeekDay <= 5)
    {
        printf("今天是工作日撑教!好好工作朝墩!\n");
    }
    else if (Weekday >=6 && Weekday <=7)
    {
        printf("今天是周末!好好休息伟姐!");
    }
    else
    {
        printf("你輸入有誤哦收苏!");
    }
    return 0;
}

看到了吧,我們成功地運(yùn)用了分支愤兵。這個(gè)只是一個(gè)簡(jiǎn)單的例子鹿霸,以后大家寫(xiě)程序的時(shí)候,大概就沒(méi)有這么簡(jiǎn)單的了秆乳。很多情況下懦鼠,我們需要嵌套分支來(lái)使用钻哩。那么嵌套的時(shí)候,有些地方就要注意了肛冶,下面引用一個(gè)例子:

//Example 08
#include <stdio.h>
int main(void)
{
    char isRain,isFree;
    
    printf("是否有空街氢?(Y/N)");
    scanf("%c",&isFree);
    
    printf("是否下雨?(Y/N)");
    scanf("%c",&isRain);
    
    if (isFree == 'Y' || isFree == 'y')
        if (isRain == 'Y' || isRain == 'y')
            printf("記得帶傘哦睦袖!\n");
    else 
        printf("女神沒(méi)空阳仔!\n");
    return 0;
}

程序?qū)崿F(xiàn)如下:

//Consequence 08-1
是否有空?(Y/N)Y
是否下雨扣泊?(Y/N)Y
記得帶傘哦!

貌似沒(méi)什么問(wèn)題嘶摊,但是如果下面這樣:

//Consequence 08-2
是否有空延蟹?(Y/N)Y
是否下雨?(Y/N)N
女神沒(méi)空叶堆!

我的天阱飘,女神有空而且天公作美的情況下,程序居然告訴我女神沒(méi)空虱颗?沥匈??

其實(shí)我們分析下代碼忘渔。代碼的意思高帖,大概是先在有空的情況下,如果下雨就提醒帶傘畦粮,如果沒(méi)空就直接告訴你沒(méi)空散址。可是上面的問(wèn)題是怎么回事呢宣赔?

其實(shí)你們被上面的縮進(jìn)騙了预麸。從上面的縮進(jìn)來(lái)看,else應(yīng)該是與第一個(gè)if同級(jí)儒将,而不是第二個(gè)吏祸。但是!由于你沒(méi)有加大括號(hào)钩蚊,C語(yǔ)言沒(méi)法判斷你的語(yǔ)句塊從屬關(guān)系贡翘,那么就默認(rèn)else跟隨最近的那一個(gè)if。所以两疚,這里的else是跟隨第二個(gè)if的床估,這么看就不難理解輸出結(jié)果了。如果要更改诱渤,那么像下面這樣就可以了:

//Example 08 V2
#include <stdio.h>
int main(void)
{
    char isRain,isFree;
    
    printf("是否有空丐巫?(Y/N)");
    scanf("%c",&isFree);
    
    printf("是否下雨?(Y/N)");
    scanf("%c",&isRain);
    
    if (isFree == 'Y' || isFree == 'y')
    {
        if (isRain == 'Y' || isRain == 'y')
        {
            printf("記得帶傘哦!\n");
        }
    }
    else 
        printf("女神沒(méi)空递胧!\n");
    return 0;
}

建議所有的if都打上大括號(hào)碑韵,至于怎么打,是個(gè)人習(xí)慣缎脾,比如{是打在if之后還是下一行祝闻,這都無(wú)所謂,但是確定了就盡量使用一種遗菠,不然以后自己看自己寫(xiě)的代碼都會(huì)感覺(jué)很奇怪了联喘。

switch 語(yǔ)句

雖然if語(yǔ)句十分方便而且靈活,但是在某些情況下辙纬,使用switch還是會(huì)更直觀一些豁遭。

switch的通式為:

switch(變量名)
{
    case 常量1:語(yǔ)句1;break;
    case 常量2:語(yǔ)句2;break;
    case 常量3:語(yǔ)句3;break;
    case 常量4:語(yǔ)句4;break;
    case 常量5:語(yǔ)句5;break;
    case 常量6:語(yǔ)句6;break;
        ...
    case 常量n:語(yǔ)句n;break;
    default 常量:語(yǔ)句;break;
}

switch語(yǔ)句中case后面只能跟一個(gè)確定的值,而不能是范圍等等贺拣。所以在特定的條件下會(huì)很直觀蓖谢,但是不夠靈活。

比如上面Example 07中的代碼譬涡,用switch可以這么改寫(xiě):

//Example 07 V2
#include <stdio.h>
int main(void)
{
    int (Weekday);
    printf("輸入今天星期的數(shù)字:");
    scanf("%d",&Weekday);//此處用于獲取用戶輸入的內(nèi)容并賦值給Weekday
    switch Weekday
    {
        case 1:printf("今天周一闪幽,一鼓作氣");break;
        case 2:printf("今天周二,再接再厲");break;
        case 3:printf("今天周三涡匀,堅(jiān)持到底");break;
        case 4:printf("今天周四盯腌,效率第一");break;
        case 5:printf("今天周五,最后一擊");break;
        case 6:printf("今天周六陨瘩,好好休息");break;
        case 7:printf("今天周日腊嗡,玩的開(kāi)心");break;
        default:printf("你輸入的有誤哦!");break;
    }
}

這樣一來(lái)是不是很直觀呢拾酝?但是雖然直觀燕少,不是所有的時(shí)候都適合用這樣的語(yǔ)句,大家根據(jù)自身的情況來(lái)選就行啦蒿囤。

至于為什么一定要加break客们,那是因?yàn)槠鋵?shí)case在這里面只是一個(gè)標(biāo)記而已,也就是說(shuō)材诽,如果我滿足case3底挫,那么程序就自動(dòng)跳到case3,然后繼續(xù)往下執(zhí)行脸侥。假設(shè)我一共有case7建邓,那么不加break的話,case3一直到case7的語(yǔ)句都會(huì)被逐個(gè)執(zhí)行睁枕,明白了吧官边?


循環(huán)

上面分支講了那么多沸手,現(xiàn)在我們來(lái)看看循環(huán)。

可以說(shuō)注簿,循環(huán)的出現(xiàn)契吉,大大減少了程序員的工作量。而且正因?yàn)橛辛搜h(huán)诡渴,程序員才能夠通過(guò)巧妙的算法來(lái)使用循環(huán)去解決問(wèn)題捐晶。比如,我現(xiàn)在想輸出1-100之間的所有整數(shù)妄辩,如果沒(méi)學(xué)循環(huán)惑灵,你可能會(huì)這么寫(xiě):

//Example 09
#include <stdio.h>
int main(void)
{
    printf("1\n");
    printf("2\n");
    printf("3\n");
    ...
    printf("100\n");
    return 0;
}

這樣寫(xiě)的邏輯思路沒(méi)有錯(cuò),但是誰(shuí)會(huì)愿意呢眼耀?這樣的編程有什么意義泣棋?我還不如拿一張紙記下來(lái)還更快呢。但是畔塔,我們是可以發(fā)現(xiàn)其中的規(guī)律的,就是每次輸出都比之前的數(shù)大1鸯屿,對(duì)吧澈吨?這就是接下來(lái)要講的循環(huán)。

while循環(huán)

while循環(huán)也就是我們所說(shuō)的當(dāng)型循環(huán)寄摆。它的通式是:

while(條件表達(dá)式)
    循環(huán)體

當(dāng)滿足一定的條件的時(shí)候谅辣,程序會(huì)自動(dòng)循環(huán)寫(xiě)在循環(huán)體中的代碼。比如上面的例子09中所體現(xiàn)出的婶恼,輸出1-100桑阶。那么我們實(shí)現(xiàn)思路可以先設(shè)置一個(gè)變量,讓這個(gè)變量每循環(huán)一次就加個(gè)1勾邦,然后當(dāng)加到101的時(shí)候停止即可蚣录。寫(xiě)成代碼如下:

//Example 09 V2
#include <stdio.h>
int main(void)
{
    int i = 1;
    while (i < 101)
    {
        printf("%d\n",i);
        i++;
    }
    return 0;
}

這樣,程序就自動(dòng)執(zhí)行輸出我們想要的結(jié)果了眷篇,比一個(gè)一個(gè)手動(dòng)要快了太多萎河。

do-while循環(huán)

如果說(shuō)while循環(huán)是個(gè)君子,那么do-while就是莽夫蕉饼。while是先判斷再執(zhí)行虐杯,而本少爺則是管他什么,先執(zhí)行再說(shuō)昧港。你可能已經(jīng)猜到了擎椰,這就是直到型循環(huán)。do-while的語(yǔ)句通式如下:

do
    循環(huán)體
while (條件表達(dá)式);//(注意创肥,這里有分號(hào))

比如我們要算1加到100的和达舒,也可以通過(guò)上面的例子用do-while進(jìn)行更改:

//Example 09 V3
#include <stdio.h>
int main(void)
{
    int i = 1,sum = 0;
    do
    {
        sum += i;
        i++;
    }
    while (i<101);
    printf("結(jié)果是%d\n",sum);
    return 0;
}

這次就不是每次都輸出i了值朋,而是每次吧i的值加到sum里面去,這樣就可以算出最終結(jié)果了休弃。

for循環(huán)

通過(guò)上面的兩個(gè)例子大家也應(yīng)該有點(diǎn)感覺(jué)了吞歼,在循環(huán)之前,一般是要定義一個(gè)計(jì)數(shù)變量塔猾,以此作為循環(huán)結(jié)束的參考篙骡。那么既然這樣,有沒(méi)有一種東西可以一次完成呢丈甸?這就是for語(yǔ)句糯俗。for循環(huán)就把計(jì)數(shù)變量和條件整合到一起去了,看通式:

for (循環(huán)初始化;循環(huán)條件;循環(huán)調(diào)整)
    循環(huán)體;

具體是啥意思睦擂,我們還是看例子得湘。我們把上面的求和代碼改成使用for:

//Example 09 V4
#include <stdio.h>
int main(void)
{
    int i, sum = 0;
    for (i = 1; i < 101; i++)
    {
        sum += i;
    }
    printf("結(jié)果是%d", sum);
    return 0;
}

其實(shí)也是非常直觀的。for語(yǔ)句其實(shí)三個(gè)成分可以不用都寫(xiě)甚至可以不寫(xiě)顿仇,但是分號(hào)一定要保留淘正。如果沒(méi)有明確的目的,那么最好不要這樣用臼闻,因?yàn)闀?huì)使代碼可讀性下降鸿吆。

break語(yǔ)句

這個(gè)語(yǔ)句用于跳出循環(huán)。如果我們遍歷i來(lái)尋找一個(gè)值述呐,但凡找到惩淳,那其實(shí)就不用往下繼續(xù)找了,那么就可以在循環(huán)中設(shè)置一個(gè)條件語(yǔ)句乓搬,如果找到結(jié)果則使用break跳出循環(huán)思犁,這樣可以節(jié)約算力。

但是进肯,break只能跳出當(dāng)前所在的循環(huán)激蹲,使用的時(shí)候一定注意。

continue語(yǔ)句

跳過(guò)本輪循環(huán)然后進(jìn)入下一輪循環(huán)江掩。這個(gè)直接說(shuō)可能沒(méi)什么概念托呕,我們看看下面的例子:

//Example 10
#include <stdio.h>
int main(void)
{
    int ch;
    while ((ch = getchar()) != '\n')
    {
        if (ch == 'e')
        {
            countinue;
        }
        putchar(ch);
    }
    putchar('\n');
    return 0;
}

這段代碼是讓用戶輸入一些字符,然后剔除其中的e然后再輸出频敛。

//Consequence 10
TechZone
TchZon

應(yīng)該很好理解吧项郊,只要遇到了e就跳出本次循環(huán),于是putchar()就被跳過(guò)去了斟赚。

可能有很多同學(xué)都覺(jué)得forwhile其實(shí)差不多着降,但是,在continue語(yǔ)句里面很有可能就不一樣拗军。比如:

//Example 11
#include <stdio.h>
int main(void)
{
    int i;
    for (i = 1; i < 10; i++)
    {
        if (i == 5)
        {
            continue;
        }
        printf("i = %d\n", i);
    }
    return 0;
}

如果讓你把這個(gè)改成while任洞,可能有的小伙伴會(huì)這么改:

//Example 11 V2
#include <stdio.h>
int main(void)
{
    int i = 1;
    while (i < 10)
    {
        if ( i == 5)
        {
            continue;
            i++;
        }
        printf("i = %d\n", i);
        i++;
    }
}

這么看起來(lái)好像沒(méi)有問(wèn)題蓄喇,但是執(zhí)行到continue的時(shí)候,程序就陷入了死循環(huán)交掏,無(wú)法執(zhí)行到i++妆偏。因此不要隨意更改已有的循環(huán),如果真的有需要去改盅弛,也一定要思考清楚邏輯钱骂,想當(dāng)然多半是會(huì)犯錯(cuò)誤的。

逗號(hào)運(yùn)算符

當(dāng)某個(gè)部分需要多個(gè)表達(dá)式的時(shí)候挪鹏,使用逗號(hào)運(yùn)算符來(lái)拼接见秽。逗號(hào)運(yùn)算符的優(yōu)先級(jí)是最低的,但是它可以使整體從左到右進(jìn)行讨盒。比如:

//Example 12
#include <stdio.h>
int main(void)
{
    int a,b,c;
    a = (b = 3, (c = b + 4) + 5);
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

在第6行里面解取。雖然c = b + 4被優(yōu)先級(jí)最高的小括號(hào)括了起來(lái),但是由于逗號(hào)運(yùn)算符返顺,還是優(yōu)先從b = 3開(kāi)始執(zhí)行禀苦。

條件運(yùn)算符

在C語(yǔ)言中,還有一種分支表達(dá)式就是條件運(yùn)算符遂鹊,它的通式為exp1?exp2:exp3;振乏,其中exp1是條件表達(dá)式,當(dāng)這個(gè)表達(dá)式判斷為時(shí)稿辙,執(zhí)行exp2,反之執(zhí)行exp3气忠。比如下面的分支:

//Example 13
#include <stdio.h>
int main(void)
{
    int a = 3,b = 2;
    if (a > b)
    {
        printf("Max is a\n");
    }
    else
    {
        printf("Max is b\n");
    }
    return 0;
}

這個(gè)就可以改成:

//Example 13 V2
#include <stdio.h>
int main(void)
{
    int a = 3,b = 2;
    a > b ? printf("Max is a\n"):printf("Max is b\n");
    return 0;
}

在條件不復(fù)雜的情況下使用這種語(yǔ)句其實(shí)更加方便邻储,具體還是看個(gè)人的習(xí)慣來(lái)使用。

goto語(yǔ)句

goto語(yǔ)句其實(shí)是個(gè)歷史遺留問(wèn)題旧噪。早期的編程語(yǔ)言都有匯編語(yǔ)言留下來(lái)的痕跡吨娜,goto就是其中之一。goto的作用就是讓程序直接跳轉(zhuǎn)到指定的位置淘钟。比如:

//Example 14
#include <stdio.h>
int main(void)
{
    int i = 5;
    while (i++)
    {
        if (i > 10)
        {
            goto Lable;
        }
    }
Lable: printf("Here, i = %d\n", i);
    return 0;
}

當(dāng)i>10的時(shí)候直接跳轉(zhuǎn)到Lable處了宦赠。

很多初學(xué)者剛剛接觸goto的時(shí)候可能會(huì)覺(jué)得很實(shí)用,但是提醒大家米母,在實(shí)際開(kāi)發(fā)的過(guò)程中勾扭,最好不用goto語(yǔ)句。因?yàn)樵诖a之間跳來(lái)跳去铁瞒,會(huì)破壞程序原有的邏輯妙色。早期的程序代碼就是滿篇的goto,沒(méi)有強(qiáng)大的大腦慧耍,很難一次性看懂代碼在講什么身辨。所以早期的程序員還真不是一般人能攬下的活兒丐谋。

但是,有一種情況可以使用煌珊,就是要一次性跳出多層循環(huán)的時(shí)候号俐,使用goto會(huì)更加直觀,比多個(gè)break好用定庵。

嵌套循環(huán)

剛剛講過(guò)吏饿,在實(shí)際的開(kāi)發(fā)中,多層嵌套循環(huán)是會(huì)經(jīng)常出現(xiàn)的洗贰。那么找岖,在這里我們舉個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明下,輸出九九乘法表:

//Example 15
#include <stdio.h>
int main(void)
{
    int i,j;
    for (i=1; i<=9; i++)
    {
        for (j=1; j<=i; j++)
        {
            printf("%d*%d=%-2d\t", i, j, i*j);
        }
        putchar('\n');
    }
    return 0;
}

輸出結(jié)果:

//Consequence 15
1*1=1
2*1=2   2*2=4
3*1=3   3*2=6   3*3=9
4*1=4   4*2=8   4*3=12  4*4=16
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64
9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

以上就是分支與循環(huán)的基礎(chǔ)知識(shí)了敛滋,如果覺(jué)得學(xué)會(huì)了许布,那就趕緊開(kāi)始實(shí)踐。只有通過(guò)不斷的debug绎晃,才能提升自己蜜唾!這期博客就到此結(jié)束啦,是目前為止最長(zhǎng)的一篇博客了庶艾,下期見(jiàn)袁余!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咱揍,隨后出現(xiàn)的幾起案子颖榜,更是在濱河造成了極大的恐慌,老刑警劉巖煤裙,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掩完,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡硼砰,警方通過(guò)查閱死者的電腦和手機(jī)且蓬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)题翰,“玉大人恶阴,你說(shuō)我怎么就攤上這事”希” “怎么了冯事?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)血公。 經(jīng)常有香客問(wèn)我桅咆,道長(zhǎng),這世上最難降的妖魔是什么坞笙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任岩饼,我火速辦了婚禮荚虚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘籍茧。我一直安慰自己版述,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布寞冯。 她就那樣靜靜地躺著渴析,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吮龄。 梳的紋絲不亂的頭發(fā)上俭茧,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音漓帚,去河邊找鬼母债。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尝抖,可吹牛的內(nèi)容都是我干的毡们。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昧辽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衙熔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起搅荞,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤红氯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咕痛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痢甘,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年暇检,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了产阱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婉称。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡块仆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出王暗,到底是詐尸還是另有隱情悔据,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布俗壹,位于F島的核電站科汗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绷雏。R本人自食惡果不足惜头滔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一怖亭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坤检,春花似錦兴猩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至箭跳,卻和暖如春晨另,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谱姓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工借尿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逝段。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓垛玻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奶躯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帚桩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354