學益得線上課堂
從基礎學習嵌入式
玩轉智能硬件、斬獲高薪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++)
{
//循環體
}
}
第一種效率要低於第二種效率。
更多視頻、文章、嵌入式學習資源,微信關注 【學益得智能硬件】。