【嵌入式修煉之路】- C語言第三課之程序結構

學益得線上課堂
從基礎學習嵌入式
玩轉智能硬件、斬獲高薪offer

if語句

if 語句是C語言中最簡單、最常用的語句,然而很多程序員用隱含錯誤的方式寫 if 語句。所以本節課程就以 “與零值比較” 開始課程。

與零值比較

常見的寫法是這樣的

#include <stdio.h>

int main()
{
    int a = 0;

    if (a == 0)           //變量寫在左邊,常量寫在右邊
    {
        printf("helloworld\n");
    }
    
    return 0;
}

一名合格的程序猿是這樣寫的

#include <stdio.h>

int main()
{
    int a = 0;

    if (0 == a)       //常量寫在左邊,變量寫在右邊
    {
        printf("helloworld\n");
    }
    
    return 0;
}

爲什麼會這樣寫?我們在寫代碼的時候,會不自覺的把 == 寫成 =,含義完全變掉了,從邏輯運算符變成了賦值運算符。

if (a == 0);     //判斷變量 a 是不是 0。
if (a = 0);      //變量 a 賦值爲 0。

如果不小心寫成了第二種,含義變了,但是編譯的時候卻沒有問題。運行的時候結果大不一樣,而且很難定位。

if (0 == a);
if (0 = a);       //編譯報錯

如果換成第二種寫法,就算寫代碼的時候不小心丟掉了一個 = 也不用擔心,因爲常量不能作爲左值使用,編譯直接報錯。

if 語句的常見用法

if (condition1)    //如果 condition1 條件成立,則執行下面的語句1
{
    //語句1
}
if (condition1)     //如果 condition1 條件成立,則執行語句1,否則執行語句2
{
    //語句1
}
else
{
    //語句2
}
if (condition1)          //如果條件1成立,執行語句1,結束;如果不成立,判斷條件2
{
    //語句1
}
else if (condition2)     //如果條件2成立,執行語句2,結束;如果不成立,執行語句3
{
    //語句2
}
else 
{
    //語句3
}

簡易計算器

#include <stdio.h>

int main()
{
    int num1, num2;
    char opt;

    scanf("%d%c%d", &num1, &opt, &num2);

    if ('+' == opt)
    {
        printf("%d\n", num1 + num2);
    }
    else if ('-' == opt)
    {
        printf("%d\n", num1 - num2);
    }
    else if ('*' == opt)
    {
        printf("%d\n", num1 * num2);
    }
    else if ('/' == opt)
    {
        printf("%d\n", num1 / num2);
    }
    else
    {
        printf("error\n");
    }
    
    return 0;
}

switch語句

switch語句是一種多分支選擇語句,在實際應用中,要在多種情況中選擇一種情況,執行某一部分語句。形式如下:

switch(condition)
{
    case 常量表達式1:        //如果condition能夠匹配常量表達式1,則執行語句1,結束
        //語句1          
        break;             //如果不加 break 執行完語句1,程序會繼續執行下一行代碼
    case 常量表達式2:
        //語句2
        break;
    case 常量表達式3:
        //語句3
        break;
    ....
    default:
        //語句4
}

簡易計算器

#include <stdio.h>

int main()
{
    int num1, num2;
    char opt;

    scanf("%d%c%d", &num1, &opt, &num2);

    switch(opt)
    {
        case '+':
            printf("%d\n", num1 + num2);
            break;
        case '-':
            printf("%d\n", num1 - num2);
            break;
        case '*':
            printf("%d\n", num1 * num2);
            break;
        default:
        	printf("error\n");
    }
    
    return 0;
}

while循環

while循環是C語言常用循環語句之一。如果循環的次數不確定,可以使用while循環。用法如下:

while (condition)      //只要條件成立, 就執行循環體
{
    //循環體
}

示例

寫一道很經典的筆試題:某地房價200萬,每年漲10%;某程序猿年薪40萬,不漲工資。假設他不喫不喝不消費,問幾年能買得起房?

很明顯,這個循環不知道循環次數,需要使用while循環。

#include <stdio.h>

int main()
{
    int sum = 0;       //存款
    int year = 0;      //經過了多少年
    double price = 200;   //房價

    while (sum < price)          //循環條件是 存款 < 房價
    {
        year++;                   //加上一年
        sum += 40;                //存款每年增加40萬
        price += 0.1 * price;     //計算房價
    }

    printf("第 %d 年買得起房!\n", year);   //滿足條件,跳出循環   
    
    return 0;
}

do while

do while 的用法如下:

do 
{
    //循環體
} while (condition);

while的特點是 先判斷、再執行,do while的特點是先執行、再判斷。

for循環

for循環一般用於循環次數確定的場景,用法如下:

for (表達式1; 表達式2; 表達式3)
{
    //循環體
}

執行順序

表達式1 -->> 表達式2 -->> 循環體 -->> 表達式3 -->> 表達式2 -->> 循環體 -->> 表達式3 -->> 表達式2 -->> 循環體 …

注意:表達式1只會執行一遍,作爲for循環的條件初始化使用。如果不滿足條件2,則退出循環。

示例

上節課留了一個問題

int i = 0;

for (i = 0, printf("i = %d\n", i); i < 5, printf("i = %d\n", i); i++, printf("i = %d\n", i))
{
    printf("helloworld!\n");
}

結果是一個死循環!

for循環的表達式2是一個逗號表達式,逗號表達式的執行順序:先執行 i < 5,不管成立或者不成立,都不作爲 for 循環表達式2的結果。表達式2的結果應該是 printf 函數的返回值。 i < 5 確實執行了,只不過結果沒有起作用,printf 函數纔會對 for 循環起到限制作用,而 printf 返回非 0,於是 for 循環一直成立,無法退出。

continue

結束本次循環,繼續下一次循環。

int i = 0;

for (i = 0; i < 5; i++)
{
    if (2 == i)
    {
        continue;   //for 循環遇到continue,下面的代碼(循環內)不會執行,跳到語句 i++,繼續下一次循環
    }
    printf("helloworld\n");
}

break

結束本層循環。

int i;

for (i = 0; i < 5; i++)
{
    if (2 == i)
    {
        break;  //for 循環遇到break,當前循環結束,剩下的 2 次循環也結束
    }
    printf("helloworld!\n");
} 

注意:如果是循環嵌套,隻影響當前的 for 循環,不影響其他嵌套的循環。

循環效率

注意減少跨切循環層的次數,比如同樣是循環2000次:

int i, j;

for (i = 0; i < 1000; i++)      //跨循環層 1000 次。
{
    for (j = 0; j < 2; j++)
    {
        //循環體
    }
}
int i, j;

for (i = 0; i < 2; i++)      //跨循環層 2 次。
{
    for (j = 0; j < 1000; j++)
    {
        //循環體
    }
}

第一種效率要低於第二種效率。

更多視頻、文章、嵌入式學習資源,微信關注 【學益得智能硬件】

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章