'月薪20K的程序員整理的C語言的學習筆記,值得學習!(初學必備)'

"
原文轉載於:https://www.jianshu.com/p/be10d771b6d7

C語言是面向過程的,而C++是面向對象的

C和C++的區別:

C是一個結構化語言,它的重點在於算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運

算處理得到輸出(或實現過程(事務)控制)。

C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出

或實現過程(事務)控制。 所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“

設計這個概念已經被融入到C++之中 ”。

C與C++的最大區別:在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C

++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那麼是不是C就不重要了,錯!算法是程序設計的基礎,好的設計如果

沒有好的算法,一樣不行。而且,“C加上好的設計”也能寫出非常好的東西。

本文介紹C語言 運算符,這裡整理了運算符的基礎知識,並附示例代碼,希望能幫助剛剛開始學習 C語言的同學

C 運算符

運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。C 語言內置了豐富的運算符,並提供了以下類型的運算符:

算術運算符

關係運算符

邏輯運算符

位運算符

賦值運算符

雜項運算符

本章將逐一介紹算術運算符、關係運算符、邏輯運算符、位運算符、賦值運算符和其他運算符。

算術運算符

下表顯示了 C 語言支持的所有算術運算符。假設變量 A 的值為 10,變量 B 的值為 20,則:

運算符描述實例

+把兩個操作數相加A + B 將得到 30

-從第一個操作數中減去第二個操作數A - B 將得到 -10

*把兩個操作數相乘A * B 將得到 200

/分子除以分母B / A 將得到 2

%取模運算符,整除後的餘數B % A 將得到 0

++自增運算符,整數值增加 1A++ 將得到 11

--自減運算符,整數值減少 1A-- 將得到 9

實例

請看下面的實例,瞭解 C 語言中所有可用的算術運算符:


#include
main()
{
inta = 21;
intb = 10;
intc ;
c = a + b;
printf("Line 1 - c 的值是 %d\\n", c );
c = a - b;
printf("Line 2 - c 的值是 %d\\n", c );
c = a * b;
printf("Line 3 - c 的值是 %d\\n", c );
c = a / b;
printf("Line 4 - c 的值是 %d\\n", c );
c = a % b;
printf("Line 5 - c 的值是 %d\\n", c );
c = a++;
printf("Line 6 - c 的值是 %d\\n", c );
c = a--;
printf("Line 7 - c 的值是 %d\\n", c );
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Line 1 - c 的值是 31

Line 2 - c 的值是 11

Line 3 - c 的值是 210

Line 4 - c 的值是 2

Line 5 - c 的值是 1

Line 6 - c 的值是 21

Line 7 - c 的值是 22

關係運算符

下表顯示了 C 語言支持的所有關係運算符。假設變量 A 的值為 10,變量 B 的值為 20,則:

運算符描述實例

==檢查兩個操作數的值是否相等,如果相等則條件為真。(A == B) 不為真。

!=檢查兩個操作數的值是否相等,如果不相等則條件為真。(A != B) 為真。

>檢查左操作數的值是否大於右操作數的值,如果是則條件為真。(A > B) 不為真。

<檢查左操作數的值是否小於右操作數的值,如果是則條件為真。(A < B) 為真。

>=檢查左操作數的值是否大於或等於右操作數的值,如果是則條件為真。(A >= B) 不為真。

<=檢查左操作數的值是否小於或等於右操作數的值,如果是則條件為真。(A <= B) 為真。

實例

請看下面的實例,瞭解 C 語言中所有可用的關係運算符:


#include
main()
{
inta = 21;
intb = 10;
intc ;
if( a == b )
{
printf("Line 1 - a 等於 b\\n");
}
else
{
printf("Line 1 - a 不等於 b\\n");
}
if( a < b )
{
printf("Line 2 - a 小於 b\\n");
}
else
{
printf("Line 2 - a 不小於 b\\n");
}
if( a > b )
{
printf("Line 3 - a 大於 b\\n");
}
else
{
printf("Line 3 - a 不大於 b\\n");
}
/* 改變 a 和 b 的值 */
a = 5;
b = 20;
if( a <= b )
{
printf("Line 4 - a 小於或等於 b\\n");
}
if( b >= a )
{
printf("Line 5 - b 大於或等於 b\\n");
}
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Line 1 - a 不等於 b

Line 2 - a 不小於 b

Line 3 - a 大於 b

Line 4 - a 小於或等於 b

Line 5 - b 大於或等於 b

邏輯運算符

下表顯示了 C 語言支持的所有關係邏輯運算符。假設變量 A 的值為 1,變量 B 的值為 0,則:

運算符描述實例

&&稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。(A && B) 為假。

||稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真。(A || B) 為真。

!稱為邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算符將使其為假。!(A && B) 為真。

實例

請看下面的實例,瞭解 C 語言中所有可用的邏輯運算符:


#include
main()
{
inta = 5;
intb = 20;
intc ;
if( a && b )
{
printf("Line 1 - 條件為真\\n");
}
if( a || b )
{
printf("Line 2 - 條件為真\\n");
}
/* 改變 a 和 b 的值 */
a = 0;
b = 10;
if( a && b )
{
printf("Line 3 - 條件為真\\n");
}
else
{
printf("Line 3 - 條件不為真\\n");
}
if( !(a && b) )
{
printf("Line 4 - 條件為真\\n");
}
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Line 1 - 條件為真

Line 2 - 條件為真

Line 3 - 條件不為真

Line 4 - 條件為真

位運算符

位運算符作用於位,並逐位執行操作。&、 | 和 ^ 的真值表如下所示:

pqp & qp | qp ^ q

00000

01011

11110

10011

假設如果 A = 60,且 B = 13,現在以二進制格式表示,它們如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A = 1100 0011

下表顯示了 C 語言支持的位運算符。假設變量 A 的值為 60,變量 B 的值為 13,則:

運算符描述實例

&如果同時存在於兩個操作數中,二進制 AND 運算符複製一位到結果中。(A & B) 將得到 12,即為 0000 1100

|如果存在於任一操作數中,二進制 OR 運算符複製一位到結果中。(A | B) 將得到 61,即為 0011 1101

^如果存在於其中一個操作數中但不同時存在於兩個操作數中,二進制異或運算符複製一位到結果中。(A ^ B) 將得到 49,即為 0011 0001

~二進制補碼運算符是一元運算符,具有"翻轉"位效果。(~A ) 將得到 -61,即為 1100 0011,2 的補碼形式,帶符號的二進制數。

<<二進制左移運算符。左操作數的值向左移動右操作數指定的位數。A << 2 將得到 240,即為 1111 0000

>>二進制右移運算符。左操作數的值向右移動右操作數指定的位數。A >> 2 將得到 15,即為 0000 1111

實例

請看下面的實例,瞭解 C 語言中所有可用的位運算符:


#include
main()
{
unsigned inta = 60; /* 60 = 0011 1100 */
unsigned intb = 13; /* 13 = 0000 1101 */
intc = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - c 的值是 %d\\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - c 的值是 %d\\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("Line 3 - c 的值是 %d\\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - c 的值是 %d\\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - c 的值是 %d\\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c 的值是 %d\\n", c );
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Line 1 - c 的值是 12

Line 2 - c 的值是 61

Line 3 - c 的值是 49

Line 4 - c 的值是 -61

Line 5 - c 的值是 240

Line 6 - c 的值是 15

賦值運算符

下表列出了 C 語言支持的賦值運算符:

運算符描述實例

=簡單的賦值運算符,把右邊操作數的值賦給左邊操作數C = A + B 將把 A + B 的值賦給 C

+=加且賦值運算符,把右邊操作數加上左邊操作數的結果賦值給左邊操作數C += A 相當於 C = C + A

-=減且賦值運算符,把左邊操作數減去右邊操作數的結果賦值給左邊操作數C -= A 相當於 C = C - A

*=乘且賦值運算符,把右邊操作數乘以左邊操作數的結果賦值給左邊操作數C *= A 相當於 C = C * A

/=除且賦值運算符,把左邊操作數除以右邊操作數的結果賦值給左邊操作數C /= A 相當於 C = C / A

%=求模且賦值運算符,求兩個操作數的模賦值給左邊操作數C %= A 相當於 C = C % A

<<=左移且賦值運算符C <<= 2 等同於 C = C << 2

>>=右移且賦值運算符C >>= 2 等同於 C = C >> 2

&=按位與且賦值運算符C &= 2 等同於 C = C & 2

^=按位異或且賦值運算符C ^= 2 等同於 C = C ^ 2

|=按位或且賦值運算符C |= 2 等同於 C = C | 2

實例

請看下面的實例,瞭解 C 語言中所有可用的賦值運算符:


#include
main()
{
inta = 21;
intc ;
c = a;
printf("Line 1 - = 運算符實例,c 的值 = %d\\n", c );
c += a;
printf("Line 2 - += 運算符實例,c 的值 = %d\\n", c );
c -= a;
printf("Line 3 - -= 運算符實例,c 的值 = %d\\n", c );
c *= a;
printf("Line 4 - *= 運算符實例,c 的值 = %d\\n", c );
c /= a;
printf("Line 5 - /= 運算符實例,c 的值 = %d\\n", c );
c = 200;
c %= a;
printf("Line 6 - %= 運算符實例,c 的值 = %d\\n", c );
c <<= 2;
printf("Line 7 - <<= 運算符實例,c 的值 = %d\\n", c );
c >>= 2;
printf("Line 8 - >>= 運算符實例,c 的值 = %d\\n", c );
c &= 2;
printf("Line 9 - &= 運算符實例,c 的值 = %d\\n", c );
c ^= 2;
printf("Line 10 - ^= 運算符實例,c 的值 = %d\\n", c );
c |= 2;
printf("Line 11 - |= 運算符實例,c 的值 = %d\\n", c );
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Line 1 - = 運算符實例,c 的值 = 21

Line 2 - += 運算符實例,c 的值 = 42

Line 3 - -= 運算符實例,c 的值 = 21

Line 4 - *= 運算符實例,c 的值 = 441

Line 5 - /= 運算符實例,c 的值 = 21

Line 6 - %= 運算符實例,c 的值 = 11

Line 7 - <<= 運算符實例,c 的值 = 44

Line 8 - >>= 運算符實例,c 的值 = 11

Line 9 - &= 運算符實例,c 的值 = 2

Line 10 - ^= 運算符實例,c 的值 = 0

Line 11 - |= 運算符實例,c 的值 = 2

雜項運算符 ↦ sizeof & 三元

下表列出了 C 語言支持的其他一些重要的運算符,包括 sizeof 和 ? :。

運算符描述實例

sizeof()返回變量的大小。sizeof(a) 將返回 4,其中 a 是整數。

&返回變量的地址。&a; 將給出變量的實際地址。

*指向一個變量。*a; 將指向一個變量。

? :條件表達式如果條件為真 ? 則值為 X : 否則值為 Y

實例

請看下面的實例,瞭解 C 語言中所有可用的雜項運算符:


#include
main()
{
inta = 4;
shortb;
doublec;
int* ptr;
/* sizeof 運算符實例 */
printf("Line 1 - 變量 a 的大小 = %d\\n", sizeof(a) );
printf("Line 2 - 變量 b 的大小 = %d\\n", sizeof(b) );
printf("Line 3 - 變量 c 的大小 = %d\\n", sizeof(c) );
/* & 和 * 運算符實例 */
ptr = &a; /* 'ptr' 現在包含 'a' 的地址 */
printf("a 的值是 %d\\n", a);
printf("*ptr 是 %d\\n", *ptr);
/* 三元運算符實例 */
a = 10;
b = (a == 1) ? 20: 30;
printf( "b 的值是 %d\\n", b );
b = (a == 10) ? 20: 30;
printf( "b 的值是 %d\\n", b );
}

當上面的代碼被編譯和執行時,它會產生下列結果:

a 的值是 4

*ptr 是 4

b 的值是 30

b 的值是 20

C 中的運算符優先級

運算符的優先級確定表達式中項的組合。這會影響到一個表達式如何計算。某些運算符比其他運算符有更高的優先級,例如,乘除運算符具有比加減運算符更高的優先級。

例如 x = 7 + 3 * 2,在這裡,x 被賦值為 13,而不是 20,因為運算符 * 具有比 + 更高的優先級,所以首先計算乘法 3*2,然後再加上 7。

下表將按運算符優先級從高到低列出各個運算符,具有較高優先級的運算符出現在表格的上面,具有較低優先級的運算符出現在表格的下面。在表達式中,較高優先級的運算符會優先被計算。

類別 運算符 結合性

後綴 () [] -> . ++ - - 從左到右

一元 + - ! ~ ++ - - (type)* & sizeof 從右到左

乘除 * / % 從左到右

加減 + - 從左到右

移位 << >> 從左到右

關係 < <= > >= 從左到右

相等 == != 從左到右

位與 AND & 從左到右

位異或 XOR ^ 從左到右

位或 OR | 從左到右

邏輯與 AND && 從左到右

邏輯或 OR || 從左到右

條件 ?: 從右到左

賦值 = += -= *= /= %=>>= <<= &= ^= |= 從右到左

逗號 , 從左到右

實例

請看下面的實例,瞭解 C 語言中運算符的優先級:

#include

main()

{

inta = 20;

intb = 10;

intc = 15;

intd = 5;

inte;

e = (a + b) * c / d; // ( 30 * 15 ) / 5

printf("(a + b) * c / d 的值是 %d\\n", e );

e = ((a + b) * c) / d; // (30 * 15 ) / 5

printf("((a + b) * c) / d 的值是 %d\\n", e );

e = (a + b) * (c / d); // (30) * (15/5)

printf("(a + b) * (c / d) 的值是 %d\\n", e );

e = a + (b * c) / d; // 20 + (150/5)

printf("a + (b * c) / d 的值是 %d\\n", e );

return0;

}

當上面的代碼被編譯和執行時,它會產生下列結果:

(a + b) * c / d 的值是 90

((a + b) * c) / d 的值是 90

(a + b) * (c / d) 的值是 90

a + (b * c) / d 的值是 50

這些是C/C++能做的

服務器開發工程師、人工智能、雲計算工程師、信息安全(黑客反黑客)、大數據 、數據平臺、嵌入式工程師、流媒體服務器、數

據控解、圖像處理、音頻視頻開發工程師、遊戲服務器、分佈式系統、遊戲輔助等

"

相關推薦

推薦中...