目錄
一個工程中出現(xiàn)兩個及以上的main函數(shù)
本文主要是先帶大家全局的認(rèn)識一下C語言,將C語言的主要的東西都看看,了解一下,對C語言先產(chǎn)生一個認(rèn)識,每個知識點(diǎn)后面都會多帶帶寫博客詳細(xì)介紹。
C語言是一門通用的計算機(jī)編程語言,廣泛應(yīng)用于底層開發(fā),C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程
語言,保持著良好跨平臺的特性。
由于C語言的各大優(yōu)點(diǎn)使得各大開發(fā)廠商紛紛使用,并且各個廠商都有了自己的C語言,這就使得各廠商的C語言語法出現(xiàn)差異,為了避免這種情況,由美國國家標(biāo)準(zhǔn)局為C語言制定了一套完整的美國國家標(biāo)準(zhǔn)語法,稱為ANSI C,作為C語言最初的標(biāo)準(zhǔn)。
并且C語言是一門面向過程的編程語言,編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。其中MSVC便是微軟的C語言編譯器,VS2019中的C語言便是MSVC編譯器。編譯環(huán)境的詳細(xì)搭建步驟我也已經(jīng)寫了,請點(diǎn)擊這里查看C語言編譯環(huán)境的搭建。
語言 | 用途 | 舉例 |
人類的語言 | 人與人之間交流 | 漢語,英語 |
計算機(jī)語言 | 人與計算機(jī)交流的語言 | C/C++/JAVA |
C語言廣泛應(yīng)用于底層的軟件開發(fā)
#include int main(){ printf("Hello world!"); return 0;}
?一個C語言代碼中必須包含一個main函數(shù)--主函數(shù),main函數(shù)是程序的入口,有固定寫法。要注意的是一個工程中只能有一個main函數(shù)。
main前面的int表示函數(shù)返回類型為整型,左花括號表示函數(shù)開始,右花括號表示函數(shù)結(jié)束;花括號所包含的部分叫做函數(shù)體,為該函數(shù)所要實(shí)現(xiàn)的邏輯功能語句。return 0表示返回值是0,0為整數(shù),與前面的int相呼應(yīng)。printf----print function----打印函數(shù),而printf屬于庫函數(shù),是C語言自身提供的函數(shù),庫函數(shù)的使用必須要引用頭文件,所以使用了#include
在菜單欄中有 調(diào)試--開始執(zhí)行(快捷鍵Ctrl+F5)
我們用一段代碼來驗(yàn)證一下
#include int main(){ printf("Hello world!"); return 0;}int main(){ printf("Hello world!"); return 0;}
?編譯器報錯
如果是在同一個工程中不同的.c文件中呢,也是一樣的,同一個工程中只能有一個main函數(shù)。
我們前面說過,main函數(shù)是程序的入口,如果一個工程出現(xiàn)多個main函數(shù),那么這個程序到底從哪里開始執(zhí)行,從哪個main函數(shù)進(jìn)去是不確定的。
我們在生活中經(jīng)常會用到各種各樣的數(shù)據(jù),例如年齡,體重,價格等等,而不同的數(shù)據(jù)的類型也是不一樣的,比如年齡是整數(shù),體重是小數(shù)。
我們寫程序,寫軟件也是為了能夠解決生活中的問題,描述生活中的問題,所以C語言它有各種數(shù)據(jù)類型。
char | 字符數(shù)據(jù)類型 | 字符 |
short | 短整型 | 整數(shù) |
int? | 整型 | |
long | 長整型 | |
long long | 更長的整型 | |
float | 單精度浮點(diǎn)數(shù) | 小數(shù) |
double | 雙精度浮點(diǎn)數(shù) |
我們的生活中本來就有很多種數(shù)據(jù)類型,在寫代碼的時候,我們選擇合適的數(shù)據(jù)類型去創(chuàng)建變量,解決問題,使得空間利用率更高,并且更加豐富的表達(dá)生活中的各種值。
C語言中有一個關(guān)鍵字sizeof可以用來計算各種變量,數(shù)據(jù)類型的大小
如下代碼:
#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));}
運(yùn)行結(jié)果:
(注意:sizeof計算出來的結(jié)果單位是字節(jié))
我們會發(fā)現(xiàn)int為整型,而long是長整型,結(jié)果運(yùn)行結(jié)果中int和long的大小一樣,這是怎么回事呢?注意在這里C語言標(biāo)準(zhǔn)規(guī)定,sizeof(int)<=sizeof(long),并且sizeof(long)<=sizeof(long long)
在32位平臺sizeof(long)大小為4個字節(jié),而在64位平臺,sizeof(long)大小為8個字節(jié)
選擇合適的數(shù)據(jù)類型,如下代碼:
int main(){ //這里創(chuàng)建一個年齡的變量 //short的范圍為-32768~32767,足夠表示年齡 short age = 18; //創(chuàng)建一個變量表示體重 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;}
運(yùn)行結(jié)果:
?那么這里為什么運(yùn)行結(jié)果是10而不是20呢?
有幾個點(diǎn)需要注意:
#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); //輸入想要進(jìn)行運(yùn)算的兩個數(shù) sum = n1 + n2; //將n1和n2相加并賦值給sum printf("sum=%d/n", sum); //打印sum的值 return 0;}
說明:
scanf函數(shù):代碼中用到scanf函數(shù),屬于庫函數(shù),也是要引頭文件
注意事項(xiàng):
printf函數(shù):%d表示以整數(shù)形式進(jìn)行打印。
這兩個函數(shù)中,其中格式控制字符串用于指定格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等,如下所示:
%d??????//打印整型
%c??????//打印字符
%f??????//打印浮點(diǎn)數(shù)
%p??????//以地址的形式打?。ù蛴〉刂罚?/p>
%x??????//打印16進(jìn)制整數(shù)
%o??????//打印8進(jìn)制整數(shù)
作用域(scope):這個變量哪里可以使用,哪里可以起作用,哪里就是它的作用域
生命周期:變量的生命周期指的是變量的創(chuàng)建到變量的銷毀之間的一個時間段
可以通過以下代碼的對比來深刻理解作用域
代碼1:
#include int main(){ { int n = 10; printf("n=%d/n", n); } return 0;}
運(yùn)行結(jié)果:
代碼2:
#include int main(){ { int n = 10; //printf("n=%d/n", n); } printf("n=%d/n", n); return 0;}
運(yùn)行結(jié)果 :
?分析:離int n = 10;最近的花括號所包含的里面就是變量n的作用域,它的地盤,而一但出了花括號,它就不起作用了。所以就會報錯。
代碼3:
#include int a = 10; //全局變量void test() //這里定義一個函數(shù)進(jìn)行測試{ printf("test-->a=%d/n", a);}int main(){ printf("a=%d/n", a); test(); return 0;}
運(yùn)行結(jié)果:
?從代碼3就可以看出全局變量的作用域更廣,即整個工程。
?C語言中的常量和變量的定義的形式有所差異
C語言中的常量分為以下幾種:
通過以下代碼來理解這幾種常量
代碼1:
1.字面常量
#include int main(){ //1.字面常量 55; 9.8; "b"; //直接寫出來的常量就被稱為字面常量 return 0;}
?代碼2(與代碼3進(jìn)行對比):
#include int main(){ int a = 10; printf("a=%d/n", a); a = 20; printf("a=%d/n", a); return 0;}
?運(yùn)行結(jié)果:
?代碼3:
2.const修飾的常變量
#include int main(){ //2.const修飾的常變量 const int a = 10; //用const進(jìn)行修飾,使其成為常變量 printf("a=%d/n", a); a = 20; printf("a=%d/n", a); return 0;}
?運(yùn)行結(jié)果:
?通過代碼2和代碼3的對比即可發(fā)現(xiàn),a本身為變量,但被const修飾之后,它本質(zhì)上還是一個變量,但它又具有了常屬性,不能改,在使用常量的時候是不能用const修飾的常變量的,但可以用它去表示一個不能變的量(具備常屬性的一個變量)
?比如以下情況:
?在創(chuàng)建數(shù)組的時候,數(shù)組的長度應(yīng)該是指定的一個確定的常數(shù),雖然n被const修飾之后具有了常屬性,但它本質(zhì)上還是一個變量,不能作為數(shù)組長度來使用。
3.#define定義的標(biāo)識符常量
代碼1:
?代碼2:
?可以看到這(AGE)也是不能被修改的,因?yàn)樗且环N常量
?4.枚舉常量
在生活中有很多的取值是可以一一列舉的
eg.
性別:男,女,保密
三原色:紅,綠,藍(lán)
星期:1,2,3,4,5,6,7
如下代碼:
?注意:枚舉常量也同樣是不能改變的,從運(yùn)行結(jié)果就可看出,枚舉常量它是有具體的值的,eg.RED值為0,GREEN值為1,BLUE值為2。
我們首先來認(rèn)識一下字符串,前面我們寫過這樣一個代碼
#include int main(){ printf("hello world!/n"); return 0;}
在printf函數(shù)里面被" "包含的部分即為字符串(這里的/n表示換行的意思)
以下幾種情況均為字符串
"abcde"
"b"
""? ? ? //空字符串
這種由雙引號引起來的一串字符稱為字符串字面值,簡稱字符串
注意:字符串的結(jié)束標(biāo)志是一個/0 的轉(zhuǎn)義字符。在計算字符串長度的時候/0 是結(jié)束標(biāo)志,不算作字符串內(nèi)容。通過以下代碼來理解:
#include int main(){ char arr1[] = "qwert"; char arr2[] = { "q","w","e","r","t" }; printf("%s/n", arr1); printf("%s/n", arr2);}
大家可以想想這段代碼打印的結(jié)果是什么呢?
結(jié)果如下:
?發(fā)現(xiàn)arr1正常打印,但arr2的打印結(jié)果為什么這么奇怪呢?
?接下來我們仔細(xì)分析一下:
在VS2019編譯器中按F10進(jìn)行調(diào)試,然后打開監(jiān)視器窗口:
?可以在監(jiān)視器窗口中看到arr1和arr2中存的內(nèi)容
?通過這個我們可以發(fā)現(xiàn):arr1中有/0,所以在打印過程中遇到/0停了下來;arr2中沒有/0,打印完qwert之后還未停下,繼續(xù)往后打印,而后面都是隨機(jī)值,所以就打印出來燙燙燙,/0本身的值為0,所以在往后打印過程中恰好有一個值為0,遇到結(jié)束標(biāo)志,打印結(jié)束。
那么我們就可以手動的給arr2后面添加/0或者0來讓它具有結(jié)束的標(biāo)志,不會出錯打印隨機(jī)值。如下代碼:
我們這里再介紹C語言提供的一個庫函數(shù)strlen--string length--字符串長度,這是用來計算字符串長度的,遇到/0結(jié)束,不計算/0;頭文件為
?我們會看到,arr1里賣弄一共5個字符,長度為5,沒有問題,但這個arr2由于沒有/0作為結(jié)束標(biāo)志,后面全部都是隨機(jī)值,所以strlen一直往后計算,直到遇到第22個值為0,才結(jié)束計算 ,所以它計算出來的21本身就是一個隨機(jī)值。(同樣可以后面添加"/0"或者0來解決)
這里其實(shí)我們也可以通過關(guān)鍵字sizeof來計算,但要注意的是sizeof會將"/0"計算進(jìn)去。如下代碼及結(jié)果:
前面我們見到過"/n","/0"這樣的字符,都是轉(zhuǎn)義字符
我們可以通過以下代碼來體驗(yàn)一下:將c:/code/test.c打印在屏幕上,以下代碼到底能不能實(shí)現(xiàn)?
代碼0:
?通過運(yùn)行發(fā)現(xiàn)打印的并不是我們想要的結(jié)果,這個時候就有了轉(zhuǎn)義字符(轉(zhuǎn)變它原來的意思)的概念。通過以下兩段代碼對比理解一下:
代碼1:
?代碼2:
?通過對比我們就可以發(fā)現(xiàn),在n前面加上/后,它就已經(jīng)不是單純的n了,而有了其他的作用(換行),代碼保存路徑以及請按任意鍵關(guān)閉窗口與hello之間有個空行,而代碼1沒有/n,所以就沒有空行。所以在這里/n就是一個轉(zhuǎn)義字符了。回過頭看,代碼0里面的/t也是一個轉(zhuǎn)義字符了,即水平制表符。
下來我們可以看看都有哪些轉(zhuǎn)義字符:
轉(zhuǎn)義字符 | 含義 |
/? | 在書寫連續(xù)多個問號時使用,防止他們被解析成三字母詞 |
/" | 用于表示字符常量" |
/“ | 用于表示一個字符串內(nèi)部的雙引號 |
// | 用于表示一個反斜杠,防止它被解釋為一個轉(zhuǎn)義序列符。 |
/a | 警告字符,蜂鳴 |
/b | 退格符 |
/f | 進(jìn)紙符 |
/n | 換行 |
/r | 回車 |
/t | 水平制表符 |
/v | 垂直制表符 |
/ffffd | ffffd表示1~3個八進(jìn)制的數(shù)字。 如: /130 X |
/xdd | dd表示2個十六進(jìn)制數(shù)字。 如: /x30 0 |
對以上的轉(zhuǎn)義字符解釋:
代碼1:打印字符"a"
?發(fā)現(xiàn)成功打印出來字符"a"
代碼2:打印字符單引號"""
#include int main(){ printf("%c/n", """); return 0;}
運(yùn)行程序發(fā)現(xiàn)程序報錯,那么這又是什么原因呢?
就是因?yàn)槿齻€單引號放在一起,自動的前兩個單引號結(jié)合,后面單引號落單了,所以就會報錯,這個時候就可以使用轉(zhuǎn)義字符/"?,使它成為一個普通的字符單引號,字符/"也是如此,不在啰嗦。如下代碼:
?
? ? ? ?
?????????3.//? 雙斜杠這個轉(zhuǎn)義字符其實(shí)它的用途就是我們剛才的代碼0,我們想要將代碼路徑c:/code/test.c打印到屏幕上,但是里面的/t
是一個轉(zhuǎn)義字符,現(xiàn)在我們不想讓它轉(zhuǎn)義,就想讓他打印出來/t,我們就可以使用//將它再次轉(zhuǎn)義,使/t?里面的斜杠就只是一個斜杠,如下:
?
? ? ? ? ?4./t? 水平制表符,相當(dāng)于起到了電腦鍵盤table鍵的作用
????????5.接下來我們來說說最后兩個轉(zhuǎn)義字符/ffffd和/xdd??,涉及到8進(jìn)制和16進(jìn)制
平時我們用到的10進(jìn)制數(shù)就是由0-9這10個數(shù)構(gòu)成的,那么8進(jìn)制就是由0-7這8個數(shù)構(gòu)成(16進(jìn)制就是由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn)來表示,A--10,B--11,C--12,D--13,E--14,F(xiàn)--15),在/后面跟3個8進(jìn)制數(shù),eg./061
運(yùn)行以下代碼看看結(jié)果
?可以看到結(jié)果是1,但是8進(jìn)制數(shù)061的10進(jìn)制數(shù)也不是1呀,為什么結(jié)果是1呢?因?yàn)樵谶@里它是一個字符,將8進(jìn)制數(shù)轉(zhuǎn)化為10進(jìn)制數(shù)49(ASCII碼值)之后所對應(yīng)的那個字符是1。
再詳細(xì)說說,我們的鍵盤上可以敲出來一系列的字符,eg.@#$%^&*,但是計算機(jī)只能識別二進(jìn)制呀,所以人們就給字符編了統(tǒng)一的號碼,eg.? a--97,b--98………將這種編碼稱為ASCII編碼(有專門的ASCII碼表),而字符"1"的ASCII值為49,轉(zhuǎn)化為8進(jìn)制也就是061。
/xdd 這個轉(zhuǎn)義字符我們就不再啰嗦,和/ffffd同樣的道理
下面來一道筆試題進(jìn)行練習(xí)
//程序打印的結(jié)果是什么?#include int main(){ printf("%d/n", strlen("abcdef")); printf("%d/n", strlen("c:/test/328/test.c")); return 0;}
?這段代碼的運(yùn)行結(jié)果是什么呢?可以先想想,? 第一個printf的答案比較簡單,就是字符串的長度6(注意strlen函數(shù)不計算/0),而第二個printf的答案呢,18?? 12?還是說14? 這幾個答案都不對。
我們來分析一下,在"c:/test/328/test.c"這個字符串里面,首先/t是轉(zhuǎn)義字符,作為一個整體算作一個字符,/328,這里面的8已經(jīng)超出了8進(jìn)制的范圍(8在這里本身就是一個坑),所以應(yīng)該將/32作為一個整體,16進(jìn)制,所以第二個printf打印的結(jié)果應(yīng)該是14
?
注意:
C語言風(fēng)格的注釋:/*xxxxxx*/存在缺陷,不能嵌套注釋,嵌套注釋就會出問題
C++風(fēng)格的注釋://xxxxxxx,可以注釋一行,也可以注釋多行
我們的生活中總是面臨著各種各樣的選擇,怎么選就看自己了
通過以下代碼來體驗(yàn)一下:
?
?這段代碼用到了一個if else語句,當(dāng)if后面圓括號里面的判斷條件為真時,執(zhí)行if下面的語句,當(dāng)條件為假時,執(zhí)行else后面的語句
在我們色生活中也會有很多的事情都在重復(fù),eg.起床,干飯,學(xué)習(xí),睡覺
?C語言里面有3種循環(huán)
?通過以下代碼來體驗(yàn)一下
在數(shù)學(xué)中我們經(jīng)常和函數(shù)打交道,eg. f(x,y)=x+y,這是一個二元函數(shù),該函數(shù)有兩個參數(shù)(變量),x和y,那么其實(shí)C語言里面的函數(shù)和這個也是非常相似的。通過以下代碼來了解一下
?我們之前計算加法都是直接sum=x+y這樣來算的,但在這段代碼中我們定義了一個函數(shù)Add來計算加法。首先創(chuàng)建了兩個變量x,y和z,調(diào)用Add函數(shù),并將Add函數(shù)的返回值賦給z,最后將z的值打印了出來。
重點(diǎn)再來看一下Add函數(shù),前面的int表示該函數(shù)的返回值為int類型,后面括號里面的int x,int y表示Add函數(shù)的兩個參數(shù)均為int類型。花括號里面即為函數(shù)體,創(chuàng)建了臨時變量z來接受x+y的值,并在最后將作為返回值返回
函數(shù)的特點(diǎn):簡化代碼,代碼復(fù)用
數(shù)組其實(shí)就是一組數(shù)。比如我們平時要存放一個數(shù)10,那么只需要int a = 10;就可以完成;那如果要存放1,2,3,4,5這5個數(shù)字呢,不可能創(chuàng)建5個整型變量來存放吧,這樣創(chuàng)建和使用都會很麻煩,所以這個時候就有了數(shù)組的概念----一組相同類型元素的集合。
int arr[10] = { 0,1,2,3,4 };
這個代碼中就是定義了一個數(shù)組,int表示數(shù)組內(nèi)的元素類型為整型,arr是數(shù)組名,[10]里面的10表示這個數(shù)組最多放10個元素,后面花括號里面是對這個數(shù)組進(jìn)行了初始化,前五個元素分別初始化為了0,1,2,3,4,而剩下的5個元素會默認(rèn)初始化為0??梢源蜷_監(jiān)視器來看看:
?關(guān)于數(shù)組:
如果要將數(shù)組中的某個元素打印出來呢?代碼如下:
?全部打印呢?
?代碼中我們通過一個while循環(huán)來實(shí)現(xiàn)打印數(shù)組中的全部內(nèi)容(每次打印一個元素)
+? ? -? ? *? ? /? ? %
>>? ? <<
&? ? ^? ? |
=? ? +=? ? -=? ? *=? ? /=? ? &=? ? ^=? ? |=? ? >>=? ? <<=
!? ? ? ? ? ? ? ? ? ? ? ? ? 邏輯反操作
-? ? ? ? ? ? ? ? ? ? ? ? ? 負(fù)值
+? ? ? ? ? ? ? ? ? ? ? ? ?正值
&? ? ? ? ? ? ? ? ? ? ? ? ?取地址
sizeof? ? ? ? ? ? ? ? ? 操作數(shù)的類型長度(以字節(jié)為單位)
~? ? ? ? ? ? ? ? ? ? ? ? ? 對一個數(shù)的二進(jìn)制按位取反
--? ? ? ? ? ? ? ? ? ? ? ? ?前置、后置--
++? ? ? ? ? ? ? ? ? ? ? ?前置、后置++
*? ? ? ? ? ? ? ? ? ? ? ? ? 間接訪問操作符(解引用操作符)
(類型)? ? ? ? ? ? ? ? ? 強(qiáng)制類型轉(zhuǎn)換
>
>=
<
<=
!=? ? ? ? ? ? ? ? ? ? ? ? ?用于測試“不相等”
==? ? ? ? ? ? ? ? ? ? ? ? 用于測試“相等”
&&? ? ? ? ? ? ? ? ? ? ? ? 邏輯與
||? ? ? ? ? ? ? ? ? ? ? ? ? ?邏輯或
exp1 ? exp2 : exp3
exp1, exp2, exp3, …expN
[]? ? ?()? ? ?.? ? ?->
這些操作符我們后面還會繼續(xù)講,這里先簡單了解一下
我們先來了解一下 / 這個操作符,通過以下代碼來體驗(yàn)以下:
#include int main(){ printf("%d/n", 7 / 2); return 0;}
那么這段代碼的運(yùn)行結(jié)果是什么呢?? ?3.5?
運(yùn)行結(jié)果:
?發(fā)現(xiàn)運(yùn)行結(jié)果是3,這是為什么呢?
來分析一下,C語言里面的 / 和我們平時數(shù)學(xué)中的除號還是有區(qū)別的,這里是整除求商的意思,7除以2本來應(yīng)該是3.5,但這里是整除,商只有3,沒有5,所以結(jié)果為3。那么如果我們想要得到3.5應(yīng)該怎么做呢?只需要讓 / 兩邊的數(shù)字有一個是小數(shù)即可,如下代碼:
那么有沒有哪個操作符是用來整除求余的呢,肯定是有的------%取模操作符,如下代碼:
?7對2整除的余數(shù)便是1
再來看看移位操作符:右移操作符>> 和左移操作符?<
#include int main(){ int a = 8; printf("%d/n", a >> 1); return 0;}
這里的a>>1表示將a的值向右移動一位,那么移動一位到底移的是什么位呢? 移的是二進(jìn)制位,那么我們在這里將a先寫成二進(jìn)制形式為1000,而這里的a又是一個整型,4個字節(jié)----32個比特位,準(zhǔn)確來寫應(yīng)該是00000000000000000000000000001000,這里將a向右移動 一位我們通過下圖來更深刻的理解:
?可以看到右移之后1的權(quán)重降低,值變?yōu)?,可以通過運(yùn)行來驗(yàn)證一下
?左移同樣也是這樣,我們通過后面的博客細(xì)細(xì)道來。
位操作符:
&? ? ? ? ? ? ?按位(二進(jìn)制位)與
|? ? ? ? ? ? ? ?按位(二進(jìn)制位)或
^? ? ? ? ? ? ? 按位(二進(jìn)制位)異或
同樣通過以下代碼來體驗(yàn)一下:
#include int main(){ int a = 5; int b = 3; int c = a & b; printf("%d/n", c); return 0;}
通過下圖來理解
?所以a&b的結(jié)果就是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也是同樣的效果
單目操作符
前面我們看到的+,它就有兩個操作數(shù),a+b,必須有兩個操作數(shù),而單目操作符就是只有一個操作數(shù)
邏輯反操作 ! ,這個操作符它只關(guān)注操作數(shù)的真假
C語言里面是如何區(qū)分真假的呢?
0----表示假
非0----表示真
通過下面的代碼的結(jié)果來對比一下
下一個操作符 ~ 我們先來了解一下原碼,反碼和補(bǔ)碼的概念
比如int a = -1,我們將十進(jìn)制數(shù)字轉(zhuǎn)化為二進(jìn)制數(shù)字得到的是他的原碼,通過圖來理解
?注意:
以下代碼
#include int main(){ int a = 0; //分析: //a的原碼:00000000000000000000000000000000 //補(bǔ)碼: 00000000000000000000000000000000 //按位取反 11111111111111111111111111111111 //反碼; 11111111111111111111111111111110 //原碼: 10000000000000000000000000000001 //所以結(jié)果應(yīng)該是-1 printf("%d/n", ~a);}
這里再加一個小的知識:
在C語言里面0分為+0和-0
+0
原碼:00000000000000000000000000000000
反碼:00000000000000000000000000000000
補(bǔ)碼:00000000000000000000000000000000
-0
原碼:10000000000000000000000000000000
反碼:11111111111111111111111111111111
補(bǔ)碼:10000000000000000000000000000000
自增自減操作符++,--
通過以下代碼來體驗(yàn)一下
#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);}
?強(qiáng)制類型轉(zhuǎn)換操作符
如下代碼:
?3.14是double類型的,將double類型的數(shù)據(jù)賦給int類型,我們發(fā)現(xiàn)編譯器報了一個警告
?那么我們應(yīng)該怎么解決呢?? 這個時候就可以用強(qiáng)制類型轉(zhuǎn)換
#include int main(){ int a = (int)3.14; return 0;}
關(guān)系操作符
關(guān)系操作符其實(shí)就是用來比較大小,這里主要再來強(qiáng)調(diào)一下判斷相等與不相等,用的是==而不是=
以下情況我們可能后面稍不注意就會犯這種錯誤
int main(){ int i = 1; if (i = 0) { printf("hello"); } return 0;}
這里會不會把hello打印出來呢?? ?答案就是:不會打印
原因:if后面的條件判斷用了一個賦值,這里不是在判斷i是不是等于0,而是將0賦給i,然后i是0條件為假,就不會打印,應(yīng)該要用==
邏輯操作符
邏輯與 &&? 表示的是如果兩邊的值都為真,那么結(jié)果為真,如果其中有一個為假,那么結(jié)果為假
羅技或 || 表示如果兩邊有一個值為真,那么結(jié)果為真,如果兩個都為假,那么結(jié)果為假
如下代碼示例:
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);}
條件操作符?
這里的條件操作符有三個操作數(shù),所以也叫三目操作符。exp1 ? exp2 : exp3
含義:表達(dá)式1的結(jié)果如果為真,就執(zhí)行表達(dá)式2,如果表達(dá)式1的結(jié)果為假,就執(zhí)行表達(dá)式3
我們之前寫代碼求兩個數(shù)的最大值都是通過if語句來判斷,現(xiàn)在我們完全可以通過條件操作符來計算,可以極大的簡化代碼。
#include { int a = 5; int b = 3; int max = a > b ? a : b; printf("%d/n", max); return 0;}
逗號表達(dá)式
逗號隔開的一串表達(dá)式。逗號表達(dá)式的結(jié)果從左向右依次計算,但表達(dá)式的結(jié)果是最后一個表達(dá)式的結(jié)果
#include int main(){ int a = (1 + 2, 2 - 3, 3 + 5); //表達(dá)式里面的從左到右以此計算,但最終結(jié)果是最后一個表達(dá)式的結(jié)果 printf("%d/n", a); //結(jié)果應(yīng)該是3+5==8 return 0;}
函數(shù)調(diào)用操作符
我們在每次調(diào)用函數(shù)的時候都必須要有函數(shù)調(diào)用操作符(),圓括號里面放參數(shù),來傳參
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關(guān)鍵字平時都是省略的,局部變量都是自動創(chuàng)建,自動銷毀的,所以C語言中的局部變量都是自動變量
auto int a=10;? ? //這里的auto平時都是省略不寫的
break? ? ? ?終止循環(huán)/switch
case? ? ? ? ?switch語句
const? ? ? ? 常變量
continue? ?繼續(xù)循環(huán)
default? ? ? ?switch
enum? ? ? ? ?枚舉
extern? ? ? ? 聲明外部符號
goto? ? ? ? ? ?跳轉(zhuǎn)(不建議使用)
register? ? ? 寄存器關(guān)鍵字
static? ? ? ? ? 靜態(tài)
(1.修飾局部變量,改變的是局部變量的生命周期,和程序的生命周期一樣
? ?2.修飾全局變量,改變了它的作用域,使這個變量只能在自己所在的源文件內(nèi)部使用
? ?3.修飾函數(shù),改變了這個函數(shù)的使用范圍,這個函數(shù)只能在自己所在的源文件內(nèi)部使用)
typedef? ? ? 類型重定義
union? ? ? ? ?聯(lián)合體/共用體
volatile? ? ? ?比較少見
這些關(guān)鍵字,我們后面都會講到。
注意:在創(chuàng)建變量的時候變量名不能是關(guān)鍵字
通過以下代碼來了解一下:
#include #define PI 3.14int main(){ double a = PI; printf("%lf/n", a);}
這里的PI就是屬于標(biāo)識符常量
這里我們來寫一個加法的宏來體驗(yàn)一下:
<文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/119681.html
上次給大家分享了一個springboot+vue的校園招聘系統(tǒng),視頻教程加項(xiàng)目源碼,都是開源的,應(yīng)該說很香了,今天再給大家分享一個不錯的springboot的項(xiàng)目。 老規(guī)矩,開源,開源,開源?。?! 金九銀十來了,小伙伴們,沖??!前面已經(jīng)整理了很多的面試題,拿去學(xué)習(xí)吧! 1,??爆肝!整理了一周的Spring面試大全【含答案】,吊打Java面試官【建議收藏】!?? 2,??肝完了,一天掌握數(shù)據(jù)...
文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來??! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
人生苦短,我用Python 開發(fā)環(huán)境搭建安裝 Python驗(yàn)證是否安裝成功安裝Pycharm配置pycharm 編碼規(guī)范基本語法規(guī)則保留字單行注釋多行注釋行與縮進(jìn)多行語句數(shù)據(jù)類型空行等待用戶輸入print輸出 運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符成員運(yùn)算符身份運(yùn)算符運(yùn)算符優(yōu)先級 字符串訪問字符串中的值字符串更新合并連接字符串刪除空白startswith()方法endswith()方法字符串格式化...
閱讀 1402·2023-04-26 01:28
閱讀 2135·2021-11-08 13:28
閱讀 2384·2021-10-12 10:17
閱讀 2413·2021-09-28 09:46
閱讀 4254·2021-09-09 09:33
閱讀 3787·2021-09-04 16:40
閱讀 1275·2019-08-29 15:21
閱讀 2752·2019-08-26 17:17