C語言運算子和操作符
C語言加減乘除
C語言中的運算子號與數學中的略有不同,請見下表。
注:除法的說明
C語言中的除法運算有點奇怪,不同型別的除數和被除數會導致不同型別的運算結果:
①當除數和被除數都是整數時,運算結果也是整數;如果不能整除,那麼就直接丟掉小數部分,只保留整數部分,這跟將小數賦值給整數型別是一個道理。
②除數或被除數中有一個是小數,那麼運算結果將也是小數,並且是 double 型別的小數。
int main() { int a = 100; int b = 12; float c = 12.0; double m = a / b; double n = a / c; printf("m=%lf, n=%lf\n", m, n); system("pause"); return 0; }
輸出結果:m=8.000000, n=8.333333
另外除數不能為 0,因為任何一個數字除以 0 都沒有意義。然而,編譯器對這個錯誤一般無能為力,很多情況下,編譯器在編譯階段根本無法計算出除數的值,不能進行有效預測,“除數為 0”這個錯誤只能等到程式執行後才能發現,而程式一旦在執行階段出現任何錯誤,只能有一個結果,那就是崩潰,並被作業系統終止執行。
int main() { int a = 0; int b = 0; int c = 0; scanf("%d%d", &a, &b); c = a / b; printf("%d", c); system("pause"); return 0; }
如果在輸入時,讓b=0,則會崩潰!
注:取餘運算的說明
取餘,也就是求餘數,使用的運算子是 %。C語言中的取餘運算只能針對整數,也就是說,% 的兩邊都必須是整數,不能出現小數,否則編譯器會報錯,另外餘數可以是正數也可以是負數,由 % 左邊的整數決定:``
如果 % 左邊是正數,那麼餘數也是正數;
如果 % 左邊是負數,那麼餘數也是負數。
int main() { printf("100%%12=%d \n100%%-12=%d \n-100%%12=%d \n-100%%-12=%d \n", 100 % 12, 100 % -12, -100 % 12, -100 % -12); system("pause"); return 0; }
*
自增和自減
a++,++a。
這種寫法叫做自加或自增,意思很明確,就是每次自身加 1。相應的,也有a–和–a,它們叫做自減,表示自身減 1。
++和–分別稱為自增運算子和自減運算子,它們在迴圈結構中使用很頻繁。
自增和自減的示例:
int main()
{
int a = 5, b = 10;
printf("a=%d, b=%d\n", a, b);
++a;
--b;
printf("a=%d, b=%d\n", a, b);
a++;
b--;
printf("a=%d, b=%d\n", a, b);
system("pause");
return 0;
輸出結果為:a=5,b=10
a=6,b=9
a=7,b=8
自增自減的結果必須得有變數來接收,所以自增自減只能針對變數,不能針對數字,例如5++是錯誤的。
前置(++)和後置(++)的區別:
++ 在前面叫做前自增(例如 ++a)。前自增先進行自增運算,再進行其他操作。
++ 在後面叫做後自增(例如 a++)。後自增先進行其他操作,再進行自增運算。
int main()
{
int a = 10;
int b = 0;
printf("a=%d", a++);
b = a;
printf("b=%d", b);
system("pause");
return 0;
}
輸出結果 a=10,b=11.
int main()
{
int a = 10;
int b = 0;
printf("a=%d", ++a);
b = a;
printf("b=%d", b);
system("pause");
return 0;
}
輸出結果 a=11,b=11.
b=a++;這個語句執行過程
因為++的優先順序高於=,因此先執行++運算子,但對於後置++,程式首先會生成一個臨時變數。將a本身先存放在臨時變數中,然後對a進行++,最後將臨時變數的值賦給 b。
b = a++;
temp = a;
a=a+1;
b = temp;
對於自減和自加基本是一樣的,就不必詳細介紹了。
移位操作符
左移操作符 <<
右移操作符 >>
左移規則:左邊拋棄,右邊補零
int main()
{
int num = 10;
printf("%d\n",num << 1);
printf("%d\n", num);
system("pause");
return 0;
}
輸出結果 20
10
**右移規則:**右移分為邏輯右移,算術右移。
邏輯右移:右邊拋棄,左邊補零
算術右移:右邊拋棄 ,左邊按符號位進行補充
**關係運算符
**關係運算符:
>
>=
==
<=
<
!=
關係表示式的運算結果只能是0或1,。
注意:=和==的區別
邏輯操作符:邏輯與(&&)邏輯或(||)
1&&1=1 1&&0=0 0&&0=0
1||1=1 0||1=1 0||0=0
三目操作符:exp1?exp1:exp2
max = a > b ? a : b;
if (a > b)
{
max = a;
}
else
{
max = b;
`}
兩段程式碼的功能是等價的,但三木運算子更方便。