老湯回味——C語言運算符及類型轉換

今天的文章一起來看看C語言的運算符,而和C語言運算符直接相關的一個問題就是類型轉換。下面先來看看C語言有哪些運算符。


算數運算符

算數運算符包括:加(+),減(-),乘(*),除(/),取餘(%),自增(++),自減(--),下面上代碼,直接看例子。

#include <stdio.h>

int main(void)
{
	int a = 10;
	int b = 2;
	printf("a + b = %d\n", a + b);
	printf("a - b = %d\n", a - b);
	printf("a * b = %d\n", a * b);
	printf("a / b = %d\n", a / b);
	printf("a %% b = %d\n", a % b);
	printf("a++ = %d, ++a = %d\n", a++, ++a);
	printf("b-- = %d, --b = %d\n", b--, --b);

	int c = a++;
	int d = a--;
	printf("c = %d\n", c);
	printf("d = %d\n", d);

	return 0;
}

運行結果:

a + b = 12
a - b = 8
a * b = 20
a / b = 5
a % b = 0
a++ = 11, ++a = 12
b-- = 1, --b = 0
c = 12
d = 13


需要說明的有以下幾點:

  1. %運算符只可以用於兩個整型;

  2. a++和++a在打印時沒有差別,但是將其賦值給變量時,存在差別,如上例中的c和d,a++是先將a賦值給變量,之後纔會做自增;++a則是自增後將值賦值給變量。--運算符與++運算符類似。


關係運算符

關係運算符用來比較兩個數的大小,包括:等於(==),不等於(!=),大於(>),大於等於(>=),小於(<),小於等於(<=),看一下例子。

#include <stdio.h>

int main(void)
{
	int a = 1;
	int b = 2;
	printf("a == b: %d\n", a == b);
	printf("a != b: %d\n", a != b);
	printf("a < b: %d\n", a < b);
	printf("a <= b: %d\n", a <= b);
	printf("a > b: %d\n", a > b);
	printf("a >= b: %d\n", a >= b);

	return 0;
}
運行結果:

a == b: 0
a != b: 1
a < b: 1
a <= b: 1
a > b: 0
a >= b: 0


可以看到,C語言中使用0和1分別代表false和true。


邏輯運算符

邏輯運算符包括:邏輯與(&&),邏輯或(||),邏輯非(!)。

#include <stdio.h>

int main(void)
{
	int a = 1;
	int b = 2;
	int c = 3;
	printf("a > b && c > b: %d\n", a > b && c > b);
	printf("a > b || c > b: %d\n", a > b || c > b);
	printf("!(a > b): %d\n", !(a > b));

	return 0;
}

運行結果:

a > b && c > b: 0
a > b || c > b: 1
!(a > b): 1

需要說明的是,邏輯運算符存在短路的機制,比如上面的第一句printf,由於a>b爲false,此時邏輯與已經不可能爲true,所以後面的c>b將不會運行,也就是說邏輯與會被第一個爲false的條件表達式所阻斷;同理,對於邏輯或,如果前面的條件表達式已經爲true,則無論後面的條件表達式爲true或者false都對結果無關緊要了,邏輯或將會執行到第一個爲true的條件表達式。


位運算符

位運算符操作整型的位,包括:按位與(&),按位或(|),異或(^),按位取反(~),左移(<<),右移(>>)。

#include <stdio.h>

int main(void)
{
	int a = 1;
	int b = 4;
	printf("a = 0x%08x\n", a);
	printf("b = 0x%08x\n", b);

	printf("a & b: 0x%08x\n", a & b);
	printf("a | b: 0x%08x\n", a | b);
	printf("a ^ b: 0x%08x\n", a ^ b);
	printf("~a: 0x%08x\n", ~a);
	printf("a << 2: 0x%08x\n", a << 2);
	printf("a >> 1: 0x%08x\n", a >> 1);

	printf("a | (1 << 2): 0x%08x\n", a | (1 << 2));
	printf("b & ~(1 << 2): 0x%08x\n", b & ~(1 << 2));

	return 0;
}

運行結果:

a = 0x00000001
b = 0x00000004
a & b: 0x00000000
a | b: 0x00000005
a ^ b: 0x00000005
~a: 0xfffffffe
a << 2: 0x00000004
a >> 1: 0x00000000
a | (1 << 2): 0x00000005
b & ~(1 << 2): 0x00000000


需要說明以下幾點:

  1. 左移運算,最高位會移出,低位補0;

  2. 右移運算,低位移出,最高位爲1,則爲1,爲0,則爲0,即保留符號位;

  3. 最後兩條printf語句,用來演示如何給一個數的第2位置位爲1和如何清除一個數第2位的1。


賦值運算符

主要包括=, +=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=,除了=運算符,其他的都是結合了其他運算符的功能,比如a += 1,就是將a和1相加,再把結果賦值給a,這裏不再贅述。


類型轉換

C語言是強類型語言,不同類型的數據之間進行運算會進行類型的轉換,轉換方式主要有兩種,強制類型轉換和隱式類型轉換。


強制類型轉換是在編碼時通過顯式編寫代碼,實現的類型轉換;隱式類型轉換則是C語言編譯器自動爲我們進行的類型轉換,總的原則是

  1. 如果表達式中的數據屬於同一個大類型,比如都是整型,則數據統一向表達式中寬度最大的轉換,如int向long轉換,有符號類型還會向無符號類型轉換,如int向unsigned int轉換;

  2. 整型和浮點型運算,整型會轉換爲浮點型。

  3. 強制將浮點型轉換爲整型,浮點型小數部分丟失。


看一個簡單的例子

#include <stdio.h>

int main(void)
{
	int a = 1;
	float b = 2.2;
	long c = 12;

	printf("a + c = %ld\n", a + c);
	printf("a + b = %f\n", a + b);
	printf("a + (int)b = %d\n", a + (int)b);

	return 0;
}

運行結果:

a + c = 13
a + b = 3.200000
a + (int)b = 3


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