iOS學習之C語言基礎學習day-03

數據類型轉換:

1.當賦值符號兩邊的數據類型不同的時候,數據類型轉換是自動的,不需要程序員插手

當給 int 類型的變量賦值的時候:

1).如果我們賦值的數據超出 int 的范圍,這個時候 c 會將數據為 1 個隨機的 int 數據.

int num =2200000000;

printf("num = %d\n",num);//num = -2094967296(后面學了進制就知道這個數怎么來的)

2).如果我們賦值的數據超出 int 的范圍太多,這個時候自動類型轉換就無能為力,編譯器直接報錯.

編譯器直接報錯

3).如果我們賦值的數據是一個小數,這個時候 c 會直接截取整數部分.

當給 float 類型的變量賦值的時候:

如果我們用一個double類型的小數給float變量賦值,會把double類型的浮點數轉換成float類型小數,不會報錯,精度丟失

2).如果我們用一個?int類型數給float變量賦值,那么就將這個整數轉換成float類型小數,所以在賦值的時候加一個 .0f!!!

當給 double 類型的變量賦值的時候:

1).如果我們用一個float類型的小數給double變量賦值,會把float類型的浮點數轉換成double類型小數,不會報錯,精度提高

2).如果我們用一個?int類型數給double變量賦值,那么就將這個整數轉換成double類型小數,所以在賦值的時候加一個 .0!!!

當給 char 類型的變量賦值的時候:

1).ASCII碼:

只要記住這3個,其他的,推出來

'A' 65

'a' 97

'0' 48

2).如果我們用一個?int類型數給 char變量賦值,其實在賦值的時候是以這個整數為 ASCII 碼所對應的字符數據.

scanf函數的簡單使用:

a:在格式控制符中用占位符來要求用戶輸入 1 個指定類型的數據.

b:在后面寫上要將用戶輸入的數據到 1 個變量的地址,用 & 就可以取到變量的地址.

c:如果程序沒有輸出信息,下面的控制臺輸出區域不會自動彈出來的.

注意:scanf函數是一個阻塞式函數,用戶不輸入,就不會往下執行。

scanf 函數

scanf函數接收各個類型的數據:

1).使用 scanf 函數接收其他類型的數據,想要讓用戶輸入什么類型的數據,是根據格式占位符來決定的

%d用戶輸入 int的數據scanf("%d", &變量名);

%f用戶輸入 float的數據scanf("%f", &變量名);

%lf用戶輸入 double的數據scanf("%lf", &變量名);

%c用戶輸入 char的數據scanf("%c", &變量名);

2).scanf函數使用的步驟:


步驟

3).使用scanf函數需要注意的細節

1.定義變量的時候不要再用a,b,c

2.注釋要寫

3.scanf函數習慣性的加了\n,這個一定一定要注意,scanf函數雙引號里不能加\n

\n可以過濾多個空白字符(換行符,制表符和空格),直到遇到非空白符的時候才終止輸入。但那個非空白符并沒有讀到scanf里

4.不要忘記加&? --->奔潰

5.scanf里面的格式控制符,一定要和你要輸入的變量的類型一致,否則會出問題

4).使用scanf函數一次接收輸入多個數據

1.沒有自定義分隔符(分隔符默認是空格/回車/tab)

1).此時如果要求輸入的是整數或者浮點數,輸入過程中的回車/空格/tab,都會被忽略.

int num_int1 =0;

float num_f =0.0f;

int num_int2 =0;

printf("輸入前%d-%f-%d\n",num_int1,num_f,num_int2);

scanf("%d%f%d",&num_int1,&num_f,&num_int2);

printf("輸入后%d-%f-%d\n",num_int1,num_f,num_int2);


輸入前0-0.000000-0

1 12.34 111

輸入后1-12.340000-111

Program ended with exit code: 0


2).如果有字符,如果在輸入字符之前有多余的操作(空格/回車/tab),數據的賦值就會有問題.

int num_int =0;

char num_char ='a';

int num_int2 =0;

printf("輸入前%d-%c-%d\n",num_int,num_char,num_int2);

scanf("%d%c%d",&num_int,&num_char,&num_int2);

printf("輸入后%d-%c-%d\n",num_int,num_char,num_int2);


輸入前0-a-0

12 b 13 ? ? //12 空格 b?空格 13 回車

輸入后12- -0 ? ? //12-空格-0

Program ended with exit code: 0


2.自定義分隔符

1).一旦指定,就要嚴格按照自定義的分隔符進行分割,絕對沒有問題的

int num_int1 =0;

char num_char ='a';

int num_int2 =0;

printf("輸入前%d-%c-%d\n",num_int1,num_char,num_int2);

scanf("%d--%c--%d",&num_int1,&num_char,&num_int2);

printf("輸入后%d-%c-%d\n",num_int1,num_char,num_int2);

這里的自定義分隔符是"--"


輸入前0-a-0 ? ? //沒有按照自定義的分隔符 "--" 進行分割,出問題了

12-b-13 ? ? //12 - b - 13?回車

輸入后12-a-0

Program ended with exit code: 0



輸入前0-a-0 ? ? //按照自定義的分隔符 "--" 進行分割,沒有出問題

12--b--13?????//12 -- b -- 13?回車

輸入后12-b-13

Program ended with exit code: 0


3.scanf函數的緩沖區

1.當控制臺停下來等待你輸入,說明緩沖區是空的

2.你輸入的所有數據都會存儲到緩沖區,然后程序從緩沖區拿數據向變量賦值

3.只要緩沖區有數據,程序再遇到scanf語句,就不會在控制臺等待你輸入,

4.程序從緩沖區拿數據,如果是給浮點數或者整數賦值,忽略空格/tab/回車,"給字符賦值,不忽略回車

例子1:輸入1空格2空格3回車

int num1=0,num2=0,num3=0;

printf("輸入前%d-%d-%d\n",num1,num2,num3);

printf("請輸入:"); ? ? //輸入1空格2空格3回車

scanf("%d%d",&num1,&num2);

printf("----------------\n");

scanf("%d",&num3);

printf("輸入后%d-%d-%d\n",num1,num2,num3);

結果是:


輸入前0-0-0

請輸入:1 2 3

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

輸入后1-2-3

Program ended with exit code: 0


從上面可以看出當從緩沖區中拿數據的時候,如果要拿的數據是整型或者實型,如果拿到的是空格 回車 Tab鍵,就會自動忽略,繼續往下拿.

例子2:

int num1 =1;

char num_c ='a';

printf("輸入前:%d-%c\n",num1,num_c);

printf("請輸入:");

scanf("%d",&num1);

scanf("%c",&num_c);

printf("輸入后:%d-%c\n",num1,num_c);

結果是:



例子2

從上面可以看出當從緩沖區中拿數據的時候,如果要拿的數據是字符型不會自忽略任何數據.

***所以我們可以用清空緩沖區的方式來解決上面的問題***

int num1 =1;

char num_c ='a';

printf("輸入前:%d-%c\n",num1,num_c);

printf("請輸入:");

scanf("%d",&num1);

rewind(stdin);//清空緩沖區

scanf("%c",&num_c);

printf("輸入后:%d-%c\n",num1,num_c);

return0;

結果是:


輸入前:1-a

請輸入:10 ? ? //輸入10回車 b回車

b

輸入后:10-b

Program ended with exit code: 0


務必記住:凡是需要輸入字符,請你單獨寫一句scanf函數,并且前面加上rewind(stdin)

交換兩個變量的值:

1.第一種方式:

int num1 =5;

int num2 =10;

printf("交換前:num1 = %d? num2 = %d\n", num1, num2);

int tempNum = num1;//tempNum = 5 num1 = 5

num1 = num2;//num1 = 10 num2 = 10

num2 = tempNum;//num2 = 5 tempNum = 5

printf("交換后:num1 = %d? num2 = %d\n", num1, num2);


交換前:num1 = 5? num2 = 10

交換后:num1 = 10? num2 = 5

Program ended with exit code: 0


2.第二種方式:兩數相加再相減

int num1 =5;//初始值

int num2 =10;//初始值

printf("交換前:num1 = %d ? num2 = %d\n", num1, num2);

num1 = num1 + num2;// num1 = num1的初始值+ num2的初始值

num2 = num1 - num2;//num2 = num1的初始值+ num2的初始值- num2的初始值num2 =? num1的初始值

num1 = num1 - num2;// num1 = num1的初始值+ num2的初始值- num1的初始值num1 = num2的初始值

printf("交換后:num1 = %d ? num2 = %d\n", num1, num2);


交換前:num1 = 5 ? num2 = 10

交換后:num1 = 10 ? num2 = 5

Program ended with exit code: 0


算術運算符和算術表達式:

算術運算符:+ - * / %

算術表達式:由算術運算符連接起來的式子

1.算數表達式的值有類型.算數表達式最終結果類型,取決于精度最高的那個數.

double>float>int

2.當參與運算的數據類型一致,算數運算表達式的結果的類型就是參與運算的數據的類型

分析下面代碼段:

//先聲明變量,再計算表達式的結果,最后將表達式的結果賦值給變量

int result =1/3;//0.3333

printf("%d\n",result);//0

doubleresult =1/3;//0.3333333??? 0 ? --- > 0.000000

printf("%lf\n",result);//0.000000

上面的算數表達式都是 int 類型的,所以這個表達式的結果是 0 ,不是 0.3333

如何獲取兩個整數的真實的商?

//思路:定義操作數為double類型、或者操作數*1.0

double result = (double)1/3;

printf("%lf\n",result);//0.333333

3.%求模運算

1>浮點數不能參與求模運算,沒有意義

2> m % n求余的結果一定是0~ n-1之間

m%n求余

(1)n 等于0無意義

(2)m 等于0結果為0

(3)m>n 正常求余如:8%3=2

(4)m<n 結果是m如:2%4=21%4=13%8=3

算術運算符的優先級和char數據參與算術運算:

1.* / %優先級相等并且高于+ - (+ -優先級相同),如果同級別,從左到右運算,如果有小括弧,就先算小括弧里的表達式.

2.char變量/常量和整數一起運算,直接拿ASCII碼進行運算

int sum ='a'+3;// 'a' -->97 + 3 ---> 100

printf("%d\n", sum);//100

char char_b ='b';

sum =3+ char_b;// 'b' -->98 + 3 --->101

printf("%d\n", sum);//101

3.如何把小寫的字母轉化為大寫

'A'--->65 ? ? ? ? ? ? ? ? ?'a'--->97

'B'--->66 ? ? ? ? ? ? ? ? ?'b'--->98

小寫-->大寫-32 ? ? ? ? 大寫-->小寫+32

復合賦值運算符:

1.常見的復合賦值運算

int num =10;

+=比如: num +=10; --->等價于num = num +10;

-=比如: num -=10; --->等價于num = num -10;

*=比如: num *=10; --->等價于num = num *10;

/=比如: num /=10; --->等價于num = num /10;

%=比如: num %=10; --->等價于num = num %10;

2.如果以后想在一個變量自身的基礎上改變當前的值,就可以使用復合賦值運算符

自增與自減運算:

1)前綴表達式:++x, --x;其中x表示變量名,先完成變量的自增自減1運算,再用x的值作為表達式的值;即“先變后用”,也就是變量的值先變,再用變量的值參與運算。

2)后綴表達式:x++, x--;先用x的當前值作為表達式的值,再進行自增自減1運算。即“先用后變”,也就是先用變量的值參與運算,變量的值再進行自增自減變化。

注意:不管“++”在前還是在后,最后變量的值都會+1

a++? -->后自增表達式-->整個a++的表達式的值是a ? --> a變量的值是a+1;

++a? -->前自增表達式-->整個++a的表達式的值是a+1--> a變量的值是a+1;

a--? --> a--表達式的值是a ? -->? a變量的值a-1

--a? --> --a表達式的值是a-1-->? a變量的值a-1

逗號表達式:

1.知道逗號表達式的結構(AAA,BBB,CCC)

2.執行過程從左向右執行

3.整個逗號表達式的結果是最后一個式子也就是CCC的值.

4.逗號表達式的目的,只要前面的表達式執行,關心最后一個表達式的結果是多少,因為我們前面的表達式一旦執行就會影響最后一個表達式的結果

比較運算符和比較表達式:

1.比較運算符:

> ?????大于

< ?????小于

>= ? ? 大于等于

<= ? ??小于等于

== ? ? 等于

!= ? ? 不等于

2.比較運算符的作用:比較大小的

3.比較表達式:由比較運算符連接起來的式子

4.比較表達式的結果:

比較表達式用來比較若干數據之間的大小關系,

比較表達式的結果是0或者 非0,0表示不成立非0表示成立

5.優先級:

> < >= <=的優先級相等

== !=的優先級相等

> < >= <=的優先級高于== !=的優先級

比較運算表達式的場景:

1.比較運算符的兩邊可以是常量或者是變量

int result =1>2;// 0//常量

int num=1;//變量

int result2 = num <2;// 1

2.比較運算符的兩邊可以分別是表達式

int num =10;

int result =11- num < num *2;// 1<20 --->1

算術運算符的優先級比關系運算符的優先級高,一個式子里面既有比較運算符又有算數運算符就先算數運算符,再算比較運算符.

3.char類型的變量或者常量也可以參與比較運算符,比較的是相應的ASCII碼

邏輯運算符:

&&邏輯與并且

||邏輯或或者

!邏輯非取反

1.計算機的世界中,"非0就是真,0就是假

2.輸入一個年份,判斷是不是閏年

(年份%400==0) || (年份%4==0)&&(年份%100!=0)

邏輯與運算符

A && B

1.&&邏輯與運算符運算規則

A和B都是真結果才是真,A和B有一個是假,結果就是假)("同真則真,一假則假")

2.斷路問題

A是假,B將不會再進行判斷,整個式子是假的

邏輯或運算符

A || B

1.||邏輯與運算符運算規則

A和B只要有一個是真結果就是真,A和B都是假,結果才是假"一真則真,同假為假"

2.斷路問題

A是真,B將不會再進行判斷,整個式子是真

!邏輯非運算規則

真變假 假變真 非零變0 0變1

邏輯運算符的優先級和結合性

1.什么是優先級

當一個表達式中,有各種各樣的不同類型的運算符的時候,此時應該先計算哪一個運算符?

解決這個問題的方案就是優先級

2.什么是結合性

當一個表達式中存在運算符的優先級相等的時候,此時應該從左向右運算還是從右向左運算

解決這個問題的方案就是結合性


運算符的優先級與結合方向

斷路問題

1.當自增自減運算和邏輯運算組合時,編譯器編譯代碼的時候,放棄優先級,從左向右掃描,最后去判斷自增自減要不要去執行

2.當邏輯&&和邏輯||組合運算時,仍然是放棄優先級,從左向右掃描,如果有斷路,后面的就不執行,如果沒有斷路,那么就按照正常的優先級來計算

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容