国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

??整理2萬字帶你走進C語言(詳細講解+代碼演示+圖解)??(強烈建議收藏!!!)

邱勇 / 4140人閱讀

目錄

一、什么是C語言?

二、第一個C語言程序

代碼

程序分析

?程序運行

一個工程中出現兩個及以上的main函數

代碼

運行結果

分析

三、數據類型

數據各種類型

為什么會有這么多的數據類型?

計算機單位

?各個數據類型的大小

?注意事項

數據類型的使用

四、變量和常量

變量的分類

變量的使用

變量的作用域和生命周期

?常量

五、字符串+轉義字符+注釋

字符串

?轉義字符

注釋

六、選擇語句

?七、循環語句

?八、函數

九、數組

數組是什么呢?

定義數組

數組的使用

十、操作符

十一、常見關鍵字

十二、#define 定義常量和宏

#define定義的標識符常量

定義宏

十三、指針

前言

引例

計算機是怎么對內存單元編號的呢?

?內存空間的地址如何得到

想存地址怎么辦?

?

本質目的不是為了存地址

指針變量的大小

?十四、結構體

為什么會有結構體呢?

創建結構體


本文主要是先帶大家全局的認識一下C語言,將C語言的主要的東西都看看,了解一下,對C語言先產生一個認識,每個知識點后面都會多帶帶寫博客詳細介紹。

一、什么是C語言?

C語言是一門通用的計算機編程語言,廣泛應用于底層開發,C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程
語言,保持著良好跨平臺的特性。

由于C語言的各大優點使得各大開發廠商紛紛使用,并且各個廠商都有了自己的C語言,這就使得各廠商的C語言語法出現差異,為了避免這種情況,由美國國家標準局為C語言制定了一套完整的美國國家標準語法,稱為ANSI C,作為C語言最初的標準。

并且C語言是一門面向過程的編程語言,編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。其中MSVC便是微軟的C語言編譯器,VS2019中的C語言便是MSVC編譯器。編譯環境的詳細搭建步驟我也已經寫了,請點擊這里查看C語言編譯環境的搭建。 

計算機語言類比理解表
語言用途舉例
人類的語言人與人之間交流漢語,英語
計算機語言人與計算機交流的語言C/C++/JAVA

C語言廣泛應用于底層的軟件開發

二、第一個C語言程序

代碼

#include int main(){	printf("Hello world!");	return 0;}

程序分析

?一個C語言代碼中必須包含一個main函數--主函數,main函數是程序的入口,有固定寫法。要注意的是一個工程中只能有一個main函數

main前面的int表示函數返回類型為整型,左花括號表示函數開始,右花括號表示函數結束;花括號所包含的部分叫做函數體,為該函數所要實現的邏輯功能語句。return 0表示返回值是0,0為整數,與前面的int相呼應。printf----print function----打印函數,而printf屬于庫函數,是C語言自身提供的函數,庫函數的使用必須要引用頭文件,所以使用了#include 。stdio--standard input output--標準輸入輸出函數

?程序運行

在菜單欄中有 調試--開始執行(快捷鍵Ctrl+F5)

一個工程中出現兩個及以上的main函數

我們用一段代碼來驗證一下

代碼

#include int main(){	printf("Hello world!");	return 0;}int main(){	printf("Hello world!");	return 0;}

運行結果

?編譯器報錯

如果是在同一個工程中不同的.c文件中呢,也是一樣的,同一個工程中只能有一個main函數。

分析

我們前面說過,main函數是程序的入口,如果一個工程出現多個main函數,那么這個程序到底從哪里開始執行,從哪個main函數進去是不確定的。

三、數據類型

我們在生活中經常會用到各種各樣的數據,例如年齡,體重,價格等等,而不同的數據的類型也是不一樣的,比如年齡是整數,體重是小數。

我們寫程序,寫軟件也是為了能夠解決生活中的問題,描述生活中的問題,所以C語言它有各種數據類型。

數據各種類型

char字符數據類型字符

short

短整型整數
int?整型
long長整型
long long更長的整型
float單精度浮點數小數
double雙精度浮點數

為什么會有這么多的數據類型?

我們的生活中本來就有很多種數據類型,在寫代碼的時候,我們選擇合適的數據類型去創建變量,解決問題,使得空間利用率更高,并且更加豐富的表達生活中的各種值。

計算機單位

?各個數據類型的大小

C語言中有一個關鍵字sizeof可以用來計算各種變量,數據類型的大小

如下代碼:

#include int main(){	printf("%d/n", sizeof(char));	printf("%d/n", sizeof(short));	printf("%d/n", sizeof(int));	printf("%d/n", sizeof(long));	printf("%d/n", sizeof(long long));	printf("%d/n", sizeof(float));	printf("%d/n", sizeof(double));}

運行結果:

?注意事項

(注意:sizeof計算出來的結果單位是字節)

我們會發現int為整型,而long是長整型,結果運行結果中int和long的大小一樣,這是怎么回事呢?注意在這里C語言標準規定,sizeof(int)<=sizeof(long),并且sizeof(long)<=sizeof(long long)

32位平臺sizeof(long)大小為4個字節,而在64位平臺,sizeof(long)大小為8個字節

數據類型的使用

選擇合適的數據類型,如下代碼:

int main(){	//這里創建一個年齡的變量	//short的范圍為-32768~32767,足夠表示年齡	short age = 18;	//創建一個變量表示體重	double weight = 58.9;	return 0;}

四、變量和常量

變量:生活中有些值是可變的(eg.年齡,身高,體重等),C語言中用變量來表示

常量:有些值是不變的(eg.身份證號,血型等),C語言中用常量來表示

變量的分類

  • 局部變量
  • 全局變量

我們通過這段代碼來了解全局變量與局部變量

#include //全局變量int i = 20;int main(){    //局部變量	int i = 10;   	printf("%d/n", i);	return 0;}

運行結果:

?那么這里為什么運行結果是10而不是20呢?

有幾個點需要注意:

  1. 花括號外面的為全局變量,花括號里面的為局部變量
  2. 當全局變量與局部變量名字相同時,局部變量優先
  3. 局部變量和全局變量的名字建議不要相同--容易誤會,產生bug

變量的使用

#include int main(){	int n1 = 0;   //定義整型變量n1,n2和num并初始化為0	int n2 = 0;	int sum = 0;	printf("請輸入n1和n2/n");     //提示用戶輸入	scanf("%d%d", &n1, &n2);    //輸入想要進行運算的兩個數	sum = n1 + n2;      //將n1和n2相加并賦值給sum	printf("sum=%d/n", sum);    //打印sum的值    return 0;}

說明

scanf函數:代碼中用到scanf函數,屬于庫函數,也是要引頭文件。按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中,這行代碼就是讓用戶從鍵盤輸入兩個整數到n1和n2的空間當中,%d表示以整數形式進行輸入;后面的&n1表示取地址n1,將輸入的第一個整數存儲到n1的空間中,&n2也是如此。一句話概括就是通過鍵盤給程序中的變量賦值。

注意事項:

  1. 在 scanf 的“輸入參數”中,變量前面的取地址符&不要忘記
  2. “輸出控制符”和“輸出參數”無論在“順序上”還是在“個數上”一定要一一對應。
  3. “輸入控制符”的類型和變量所定義的類型一定要一致。對于從鍵盤輸入的數據的類型,數據是用戶輸入的,開發者是無法決定的,所以在寫程序時要考慮容錯處理。
  4. 使用 scanf 之前先用 printf 提示輸入

printf函數:%d表示以整數形式進行打印。

這兩個函數中,其中格式控制字符串用于指定格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等,如下所示:

%d??????//打印整型

%c??????//打印字符

%f??????//打印浮點數

%p??????//以地址的形式打印(打印地址)

%x??????//打印16進制整數

%o??????//打印8進制整數

變量的作用域和生命周期

作用域(scope):這個變量哪里可以使用,哪里可以起作用,哪里就是它的作用域

  1. ?局部變量的作用域是變量所在的局部范圍。
  2. ?全局變量的作用域是整個工程。

生命周期:變量的生命周期指的是變量的創建到變量的銷毀之間的一個時間段

  1. 局部變量的生命周期是:進入作用域生命周期開始,出作用域生命周期結束
  2. 全局變量的生命周期是:整個程序的生命周期。

可以通過以下代碼的對比來深刻理解作用域

代碼1:

#include int main(){	{		int n = 10;		printf("n=%d/n", n);	}	return 0;}

運行結果:

代碼2:

#include int main(){	{		int n = 10;		//printf("n=%d/n", n);	}	printf("n=%d/n", n);	return 0;}

運行結果 :

?分析:離int n = 10;最近的花括號所包含的里面就是變量n的作用域,它的地盤,而一但出了花括號,它就不起作用了。所以就會報錯。

代碼3:

#include int a = 10;    //全局變量void test()   //這里定義一個函數進行測試{	printf("test-->a=%d/n", a);}int main(){	printf("a=%d/n", a);	test();	return 0;}

運行結果:

?從代碼3就可以看出全局變量的作用域更廣,即整個工程。

?常量

?C語言中的常量和變量的定義的形式有所差異

C語言中的常量分為以下幾種:

  • 字面常量
  • const修飾的常變量
  • #define定義的標識符常量
  • 枚舉常量

通過以下代碼來理解這幾種常量

代碼1:

1.字面常量

#include int main(){	//1.字面常量	55;	9.8;	"b";       //直接寫出來的常量就被稱為字面常量	return 0;}

?代碼2(與代碼3進行對比):

#include int main(){	int a = 10;	printf("a=%d/n", a);	a = 20;	printf("a=%d/n", a);	return 0;}

?運行結果:

?代碼3:

2.const修飾的常變量

#include int main(){        //2.const修飾的常變量	 const int a = 10;    //用const進行修飾,使其成為常變量	printf("a=%d/n", a);	a = 20;	printf("a=%d/n", a);	return 0;}

?運行結果:

?通過代碼2和代碼3的對比即可發現,a本身為變量,但被const修飾之后,它本質上還是一個變量,但它又具有了常屬性,不能改,在使用常量的時候是不能用const修飾的常變量的但可以用它去表示一個不能變的量(具備常屬性的一個變量)

?比如以下情況:

?在創建數組的時候,數組的長度應該是指定的一個確定的常數,雖然n被const修飾之后具有了常屬性,但它本質上還是一個變量,不能作為數組長度來使用。

3.#define定義的標識符常量

代碼1:

?代碼2:

?可以看到這(AGE)也是不能被修改的,因為它是一種常量

?4.枚舉常量

在生活中有很多的取值是可以一一列舉的

eg.

性別:男,女,保密

三原色:紅,綠,藍

星期:1,2,3,4,5,6,7

如下代碼:

?注意:枚舉常量也同樣是不能改變的,從運行結果就可看出,枚舉常量它是有具體的值的,eg.RED值為0,GREEN值為1,BLUE值為2。

五、字符串+轉義字符+注釋

字符串

我們首先來認識一下字符串,前面我們寫過這樣一個代碼

#include int main(){	printf("hello world!/n");	return 0;}

在printf函數里面被" "包含的部分即為字符串(這里的/n表示換行的意思)

以下幾種情況均為字符串

"abcde"

"b"

""? ? ? //空字符串

這種由雙引號引起來的一串字符稱為字符串字面值,簡稱字符串

注意:字符串的結束標志是一個/0 的轉義字符在計算字符串長度的時候/0 是結束標志,不算作字符串內容。通過以下代碼來理解:

#include int main(){	char arr1[] = "qwert";	char arr2[] = { "q","w","e","r","t" };	printf("%s/n", arr1);	printf("%s/n", arr2);}

大家可以想想這段代碼打印的結果是什么呢?

結果如下:

?發現arr1正常打印,但arr2的打印結果為什么這么奇怪呢?

?接下來我們仔細分析一下:

在VS2019編譯器中按F10進行調試,然后打開監視器窗口:

?可以在監視器窗口中看到arr1和arr2中存的內容

?通過這個我們可以發現:arr1中有/0,所以在打印過程中遇到/0停了下來;arr2中沒有/0,打印完qwert之后還未停下,繼續往后打印,而后面都是隨機值,所以就打印出來燙燙燙,/0本身的值為0,所以在往后打印過程中恰好有一個值為0,遇到結束標志,打印結束

那么我們就可以手動的給arr2后面添加/0或者0來讓它具有結束的標志,不會出錯打印隨機值。如下代碼:

我們這里再介紹C語言提供的一個庫函數strlen--string length--字符串長度,這是用來計算字符串長度的,遇到/0結束,不計算/0;頭文件為? 通過以下代碼來理解:

?我們會看到,arr1里賣弄一共5個字符,長度為5,沒有問題,但這個arr2由于沒有/0作為結束標志,后面全部都是隨機值,所以strlen一直往后計算,直到遇到第22個值為0,才結束計算 ,所以它計算出來的21本身就是一個隨機值。(同樣可以后面添加"/0"或者0來解決)

這里其實我們也可以通過關鍵字sizeof來計算,但要注意的是sizeof會將"/0"計算進去。如下代碼及結果:

?轉義字符

前面我們見到過"/n","/0"這樣的字符,都是轉義字符

我們可以通過以下代碼來體驗一下:將c:/code/test.c打印在屏幕上,以下代碼到底能不能實現?

代碼0:

?通過運行發現打印的并不是我們想要的結果,這個時候就有了轉義字符(轉變它原來的意思)的概念。通過以下兩段代碼對比理解一下:

代碼1:

?代碼2:

?通過對比我們就可以發現,在n前面加上/后,它就已經不是單純的n了,而有了其他的作用(換行),代碼保存路徑以及請按任意鍵關閉窗口與hello之間有個空行,而代碼1沒有/n,所以就沒有空行。所以在這里/n就是一個轉義字符了。回過頭看,代碼0里面的/t也是一個轉義字符了,即水平制表符

下來我們可以看看都有哪些轉義字符:

C語言轉義字符
轉義字符含義
/?在書寫連續多個問號時使用,防止他們被解析成三字母詞
/"用于表示字符常量"
/“用于表示一個字符串內部的雙引號
//用于表示一個反斜杠,防止它被解釋為一個轉義序列符。
/a警告字符,蜂鳴
/b退格符
/f進紙符
/n換行
/r回車
/t水平制表符
/v垂直制表符
/ffffdffffd表示1~3個八進制的數字。 如: /130 X
/xdddd表示2個十六進制數字。 如: /x30 0

對以上的轉義字符解釋:

  1. /?? 這個轉義字符來源于三字母詞----??),編譯器在編譯的時候總會將??)打印為],而我們如果想要讓這里的?就只是一個普通的?,就可以寫成/??)這樣的話第一個問號它就會被打印為問號,要想兩個?都被打印出來,可以寫成/?/?)即可
  2. /"??我們通過以下代碼對比來學習這個轉義字符

代碼1:打印字符"a"

?發現成功打印出來字符"a"

代碼2:打印字符單引號"""

#include int main(){	printf("%c/n", """);	return 0;}

運行程序發現程序報錯,那么這又是什么原因呢?

就是因為三個單引號放在一起,自動的前兩個單引號結合,后面單引號落單了,所以就會報錯,這個時候就可以使用轉義字符/"?,使它成為一個普通的字符單引號,字符/"也是如此,不在啰嗦。如下代碼:

?

? ? ? ?

?????????3.//? 雙斜杠這個轉義字符其實它的用途就是我們剛才的代碼0,我們想要將代碼路徑c:/code/test.c打印到屏幕上,但是里面的/t

是一個轉義字符,現在我們不想讓它轉義,就想讓他打印出來/t,我們就可以使用//將它再次轉義,使/t?里面的斜杠就只是一個斜杠,如下:

?

? ? ? ? ?4./t? 水平制表符,相當于起到了電腦鍵盤table鍵的作用

????????5.接下來我們來說說最后兩個轉義字符/ffffd和/xdd??,涉及到8進制和16進制

平時我們用到的10進制數就是由0-9這10個數構成的,那么8進制就是由0-7這8個數構成(16進制就是由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F來表示,A--10,B--11,C--12,D--13,E--14,F--15),在/后面跟3個8進制數,eg./061

運行以下代碼看看結果

?可以看到結果是1,但是8進制數061的10進制數也不是1呀,為什么結果是1呢?因為在這里它是一個字符,將8進制數轉化為10進制數49(ASCII碼值)之后所對應的那個字符是1。

再詳細說說,我們的鍵盤上可以敲出來一系列的字符,eg.@#$%^&*,但是計算機只能識別二進制呀,所以人們就給字符編了統一的號碼,eg.? a--97,b--98………將這種編碼稱為ASCII編碼(有專門的ASCII碼表),而字符"1"的ASCII值為49,轉化為8進制也就是061。

/xdd 這個轉義字符我們就不再啰嗦,和/ffffd同樣的道理

下面來一道筆試題進行練習

//程序打印的結果是什么?#include int main(){    printf("%d/n", strlen("abcdef"));    printf("%d/n", strlen("c:/test/328/test.c"));    return 0;}

?這段代碼的運行結果是什么呢?可以先想想,? 第一個printf的答案比較簡單,就是字符串的長度6(注意strlen函數不計算/0),而第二個printf的答案呢,18?? 12?還是說14? 這幾個答案都不對。

我們來分析一下,在"c:/test/328/test.c"這個字符串里面,首先/t是轉義字符,作為一個整體算作一個字符,/328,這里面的8已經超出了8進制的范圍(8在這里本身就是一個坑),所以應該將/32作為一個整體,16進制,所以第二個printf打印的結果應該是14

?

注釋

  1. 代碼中有不需要的代碼可以直接刪除,也可以注釋掉
  2. 代碼中有些代碼比較難懂,可以加一下注釋文字

注意:

C語言風格的注釋:/*xxxxxx*/存在缺陷,不能嵌套注釋,嵌套注釋就會出問題

C++風格的注釋://xxxxxxx,可以注釋一行也可以注釋多行

六、選擇語句

我們的生活中總是面臨著各種各樣的選擇,怎么選就看自己了

通過以下代碼來體驗一下:

?

?這段代碼用到了一個if else語句,當if后面圓括號里面的判斷條件為真時,執行if下面的語句,當條件為假時,執行else后面的語句

?七、循環語句

在我們色生活中也會有很多的事情都在重復,eg.起床,干飯,學習,睡覺

?C語言里面有3種循環

  • while語句
  • for語句
  • do……while語句

?通過以下代碼來體驗一下

?八、函數

在數學中我們經常和函數打交道,eg. f(x,y)=x+y,這是一個二元函數,該函數有兩個參數(變量),x和y,那么其實C語言里面的函數和這個也是非常相似的。通過以下代碼來了解一下

?我們之前計算加法都是直接sum=x+y這樣來算的,但在這段代碼中我們定義了一個函數Add來計算加法。首先創建了兩個變量x,y和z,調用Add函數,并將Add函數的返回值賦給z,最后將z的值打印了出來。

重點再來看一下Add函數,前面的int表示該函數的返回值為int類型,后面括號里面的int x,int y表示Add函數的兩個參數均為int類型花括號里面即為函數體,創建了臨時變量z來接受x+y的值,并在最后將作為返回值返回

函數的特點:簡化代碼代碼復用

九、數組

數組是什么呢?

數組其實就是一組數。比如我們平時要存放一個數10,那么只需要int a = 10;就可以完成;那如果要存放1,2,3,4,5這5個數字呢,不可能創建5個整型變量來存放吧,這樣創建和使用都會很麻煩,所以這個時候就有了數組的概念----一組相同類型元素的集合。

定義數組

int arr[10] = { 0,1,2,3,4 };

這個代碼中就是定義了一個數組,int表示數組內的元素類型為整型,arr是數組名,[10]里面的10表示這個數組最多放10個元素,后面花括號里面是對這個數組進行了初始化,前五個元素分別初始化為了0,1,2,3,4,而剩下的5個元素會默認初始化為0。可以打開監視器來看看:

數組的使用

?關于數組:

  1. 數組首元素的下標為0
  2. 通過下標來訪問數組

如果要將數組中的某個元素打印出來呢?代碼如下:

?全部打印呢?

?代碼中我們通過一個while循環來實現打印數組中的全部內容(每次打印一個元素)

十、操作符

  • 算數操作符

+? ? -? ? *? ? /? ? %

  • 移位操作符

>>? ? <<

  • ?位操作符

&? ? ^? ? |

  • 賦值操作符

=? ? +=? ? -=? ? *=? ? /=? ? &=? ? ^=? ? |=? ? >>=? ? <<=

  • 單目操作符

!? ? ? ? ? ? ? ? ? ? ? ? ? 邏輯反操作
-? ? ? ? ? ? ? ? ? ? ? ? ? 負值
+? ? ? ? ? ? ? ? ? ? ? ? ?正值
&? ? ? ? ? ? ? ? ? ? ? ? ?取地址
sizeof? ? ? ? ? ? ? ? ? 操作數的類型長度(以字節為單位)
~? ? ? ? ? ? ? ? ? ? ? ? ? 對一個數的二進制按位取反
--? ? ? ? ? ? ? ? ? ? ? ? ?前置、后置--
++? ? ? ? ? ? ? ? ? ? ? ?前置、后置++
*? ? ? ? ? ? ? ? ? ? ? ? ? 間接訪問操作符(解引用操作符)
(類型)? ? ? ? ? ? ? ? ? 強制類型轉換

  • 關系操作符

>
>=
<
<=
!=? ? ? ? ? ? ? ? ? ? ? ? ?用于測試“不相等”
==? ? ? ? ? ? ? ? ? ? ? ? 用于測試“相等”

  • 邏輯操作符

&&? ? ? ? ? ? ? ? ? ? ? ? 邏輯與
||? ? ? ? ? ? ? ? ? ? ? ? ? ?邏輯或

  • 條件操作符

exp1 ? exp2 : exp3

  • 逗號表達式

exp1, exp2, exp3, …expN

  • 下標引用、函數調用和結構成員

[]? ? ?()? ? ?.? ? ?->

這些操作符我們后面還會繼續講,這里先簡單了解一下

我們先來了解一下 / 這個操作符,通過以下代碼來體驗以下:

#include int main(){	printf("%d/n", 7 / 2);	return 0;}

那么這段代碼的運行結果是什么呢?? ?3.5?

運行結果:

?發現運行結果是3,這是為什么呢?

來分析一下,C語言里面的 / 和我們平時數學中的除號還是有區別的,這里是整除求商的意思,7除以2本來應該是3.5,但這里是整除,商只有3,沒有5,所以結果為3。那么如果我們想要得到3.5應該怎么做呢?只需要讓 / 兩邊的數字有一個是小數即可,如下代碼:

那么有沒有哪個操作符是用來整除求余的呢,肯定是有的------%取模操作符,如下代碼:

?7對2整除的余數便是1

再來看看移位操作符:右移操作符>> 和左移操作符?<

#include int main(){	int a = 8;	printf("%d/n", a >> 1);	return 0;}

這里的a>>1表示將a的值向右移動一位,那么移動一位到底移的是什么位呢? 移的是二進制位,那么我們在這里將a先寫成二進制形式為1000,而這里的a又是一個整型,4個字節----32個比特位,準確來寫應該是00000000000000000000000000001000,這里將a向右移動 一位我們通過下圖來更深刻的理解:

?可以看到右移之后1的權重降低,值變為4,可以通過運行來驗證一下

?左移同樣也是這樣,我們通過后面的博客細細道來。

位操作符

&? ? ? ? ? ? ?按位(二進制位)與

|? ? ? ? ? ? ? ?按位(二進制位)或

^? ? ? ? ? ? ? 按位(二進制位)異或

同樣通過以下代碼來體驗一下:

#include int main(){	int a = 5;	int b = 3;	int c = a & b;	printf("%d/n", c);	return 0;}

通過下圖來理解

?所以a&b的結果就是1,a|b為7,a^b為6

再看賦值操作符

#include int main(){	int a = 10;	a = a + 3;	printf("%d/n", a);	return 0;}

這里a本來是10,然后a=a+3就是給a加3之后放到a里面去,a就變成了13。并且這里用a+=5也是同樣的效果

單目操作符

前面我們看到的+,它就有兩個操作數,a+b,必須有兩個操作數,而單目操作符就是只有一個操作數

邏輯反操作 ! ,這個操作符它只關注操作數的真假

C語言里面是如何區分真假的呢?

0----表示假

非0----表示真

通過下面的代碼的結果來對比一下

下一個操作符 ~ 我們先來了解一下原碼,反碼和補碼的概念

比如int a = -1,我們將十進制數字轉化為二進制數字得到的是他的原碼,通過圖來理解

?注意:

  1. 整數在內存中存的是二進制補碼
  2. 正整數的原碼,反碼,補碼相同

以下代碼

#include int main(){	int a = 0;	//分析:	//a的原碼:00000000000000000000000000000000	//補碼:   00000000000000000000000000000000	//按位取反 11111111111111111111111111111111	//反碼;   11111111111111111111111111111110	//原碼:   10000000000000000000000000000001	//所以結果應該是-1	printf("%d/n", ~a);}

這里再加一個小的知識:

在C語言里面0分為+0和-0

+0

原碼:00000000000000000000000000000000

反碼:00000000000000000000000000000000

補碼:00000000000000000000000000000000

-0

原碼:10000000000000000000000000000000

反碼:11111111111111111111111111111111

補碼:10000000000000000000000000000000

自增自減操作符++,--

通過以下代碼來體驗一下

#include int main(){	int a = 0;	int b = a++;    //后置++,先使用a的值,然后再讓a加1	int c = 1;	int d = ++c;    //前置++,先讓c加1,然后再把c的值賦給d	printf("a=%d,b=%d/n",a,b);	printf("c=%d,d=%d/n", c, d);}

?強制類型轉換操作符

如下代碼:

?3.14是double類型的,將double類型的數據賦給int類型,我們發現編譯器報了一個警告

?那么我們應該怎么解決呢?? 這個時候就可以用強制類型轉換

#include int main(){	int a = (int)3.14;	return 0;}

關系操作符

關系操作符其實就是用來比較大小,這里主要再來強調一下判斷相等與不相等,用的是==而不是=

以下情況我們可能后面稍不注意就會犯這種錯誤

int main(){	int i = 1;	if (i = 0)	{		printf("hello");	}	return 0;}

這里會不會把hello打印出來呢?? ?答案就是:不會打印

原因:if后面的條件判斷用了一個賦值,這里不是在判斷i是不是等于0,而是將0賦給i,然后i是0條件為假,就不會打印,應該要用==

邏輯操作符

邏輯與 &&? 表示的是如果兩邊的值都為真,那么結果為真,如果其中有一個為假,那么結果為假

羅技或 || 表示如果兩邊有一個值為真,那么結果為真,如果兩個都為假,那么結果為假

如下代碼示例:

int main(){	int a = 5;	int b = 3;	int c = 0;	int d = 0;	printf("%d,%d/n", a && b, a && c);	printf("%d,%d/n", a || b, d || c);}

條件操作符?

這里的條件操作符有三個操作數,所以也叫三目操作符。exp1 ? exp2 : exp3

含義:表達式1的結果如果為真,就執行表達式2,如果表達式1的結果為假,就執行表達式3

我們之前寫代碼求兩個數的最大值都是通過if語句來判斷,現在我們完全可以通過條件操作符來計算,可以極大的簡化代碼。

#include {	int a = 5;	int b = 3;	int max = a > b ? a : b;	printf("%d/n", max);	return 0;}

逗號表達式

逗號隔開的一串表達式。逗號表達式的結果從左向右依次計算,但表達式的結果是最后一個表達式的結果

#include int main(){	int a = (1 + 2, 2 - 3, 3 + 5);   //表達式里面的從左到右以此計算,但最終結果是最后一個表達式的結果	printf("%d/n", a);    //結果應該是3+5==8	return 0;}

函數調用操作符

我們在每次調用函數的時候都必須要有函數調用操作符(),圓括號里面放參數,來傳參

十一、常見關鍵字

auto? ?break? ?case? ?char? ?const? ?continue? ?default? ?do? ?double? ?else? ?enum? ? extern? ? float? ?for? ?goto? ?if? ?int? ?long? ?register? ?return? ?short? ?signed? ?sizeof? ?static? ?struct? ? switch? ?typedef? ?union? ?unsigned? ?void? ?volatile? ?while

auto關鍵字平時都是省略的,局部變量都是自動創建,自動銷毀的,所以C語言中的局部變量都是自動變量

auto int a=10;? ? //這里的auto平時都是省略不寫的

break? ? ? ?終止循環/switch

case? ? ? ? ?switch語句

const? ? ? ? 常變量

continue? ?繼續循環

default? ? ? ?switch

enum? ? ? ? ?枚舉

extern? ? ? ? 聲明外部符號

goto? ? ? ? ? ?跳轉(不建議使用)

register? ? ? 寄存器關鍵字

static? ? ? ? ? 靜態

(1.修飾局部變量,改變的是局部變量的生命周期,和程序的生命周期一樣

? ?2.修飾全局變量,改變了它的作用域,使這個變量只能在自己所在的源文件內部使用

? ?3.修飾函數,改變了這個函數的使用范圍,這個函數只能在自己所在的源文件內部使用)

typedef? ? ? 類型重定義

union? ? ? ? ?聯合體/共用體

volatile? ? ? ?比較少見

這些關鍵字,我們后面都會講到。

注意:在創建變量的時候變量名不能是關鍵字

十二、#define 定義常量和宏

#define定義的標識符常量

通過以下代碼來了解一下:

#include #define PI 3.14int main(){	double a = PI;	printf("%lf/n", a);}

這里的PI就是屬于標識符常量

定義宏

這里我們來寫一個加法的宏來體驗一下:

<

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119681.html

相關文章

  • ??擼完這個springboot項目,我對boot輕車熟路!【源碼+視頻都開源】【強烈建議收藏】??

    上次給大家分享了一個springboot+vue的校園招聘系統,視頻教程加項目源碼,都是開源的,應該說很香了,今天再給大家分享一個不錯的springboot的項目。 老規矩,開源,開源,開源!!! 金九銀十來了,小伙伴們,沖啊!前面已經整理了很多的面試題,拿去學習吧! 1,??爆肝!整理了一周的Spring面試大全【含答案】,吊打Java面試官【建議收藏】!?? 2,??肝完了,一天掌握數據...

    AZmake 評論0 收藏0
  • ??爆肝十二萬字《python從零到精通教程》,從零教你變大佬??建議收藏

    文章目錄 強烈推薦系列教程,建議學起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...

    booster 評論0 收藏0
  • ????新生代農民工爆肝8萬字整理Python編程從入門到實踐(建議收藏)已碼:6萬字????

    人生苦短,我用Python 開發環境搭建安裝 Python驗證是否安裝成功安裝Pycharm配置pycharm 編碼規范基本語法規則保留字單行注釋多行注釋行與縮進多行語句數據類型空行等待用戶輸入print輸出 運算符算術運算符邏輯運算符成員運算符身份運算符運算符優先級 字符串訪問字符串中的值字符串更新合并連接字符串刪除空白startswith()方法endswith()方法字符串格式化...

    wthee 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<