1. 程式人生 > >C語言運算子和操作符

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;
   `}

兩段程式碼的功能是等價的,但三木運算子更方便。