C语言基础语法2
類型轉換:
1.自動轉換:
運算過程中,運算符兩邊類型不相同就會自動轉成較大的類型進行運算.
2.賦值轉換:
賦值運算的過程中產生的轉換,=號左右兩邊的類型不相同,則發生轉換.
char ? int ? ?float ? ?double
char <-->int?
int --> char ?4B -->1B
char類型只有一個字節,int有四個字節,賦值時直接將int的內存的低一個字節截斷給char 變量;
char --> int?
將一個字節賦值給4個字節,直接將char的8位復制給int的低8位,高24位采取補0或補1的方法.
有符號類型的最高位為1,則24位補1.其他情況都補0;這樣能保證數據變量.
int ?<-->float?
float --> int?
直接將float的整數部分賦值為int變量,小數丟棄.要保證整數部分不能超出int的范圍.
int ?a ?= 3.14159; ?//a = 3;
int ?--> float?
數據不變,改變數據的存儲方式為float的方式.數據的精度可能會丟失。
float <-->double?
float --> double?
數據不變,改變數據的存儲方式.
double --> float?
數據盡量不變,改變數據存儲方式.可以直接將double的十進制數據截取前面7位有效數據給float變量.
如果數據過大,報溢出錯誤,inf
3.強制轉換:
按照開發者的需求進行指定的轉換.
轉換格式:
(目標類型)變量;
float a 2.5;
2+(int)a
運算符:
表達式:
運算符表:
優先級
結合性
1.老大
()、[]、
2.單目:
++、--自加 自減。
a = 5;
b = a++; ?//先賦值后自加,b = a, a++ 之后b==5, a==6;
a = 5;
b = ++a; ?//先++,后賦值 ?++a, b=a ? 之后b==6, ? a==6
int a = 5, b = 7, c;
c = a++ + b; ?//12 期望值:a+期望得到另一個+ 。
c = a++ + ++b; //13?
a = 5;
c = a++ + a++ + a++;
sizeof() ?倫家是運算符,不是函數,求類型或變量占用內存大小
int a = 668;
sizeof(int) ==> 4; //int在內存中的大小為4個字節
sizeof (a) ==> ?4; //a在內存中占用4個字節
3.算術
* ? 乘法
/ ? (除法或取整) 除法兩邊都是整數,則進行取整運算. 否則進行除法運算
5/2 ==> 2 ? 2/5 ==> 0
5/2.0 ? ==> 2.500000
1.0*7/2 ==> 3.500000
7/2*1.0 ==> 3.000000?
% 求余/求模運算 (左右操作數必須為整數)
5%2 ==> 1?
3%5 ==> 3
+
-
4.位移運算 --(位操作是對內存的直接操作)
<<
char a = 0x1;
b = a<<1; 表示將a中的數據左移一位后給b,后邊補0,最高位丟棄.
左移N位,相當于乘以2的N次方(數據不丟失)
>>
char a = 0x60;
b = a>>1 表示將a 中的數據右移一位后給b,左側補0,最低位丟棄.
右移相當于除以2(數據位不可丟失)
char a = -4;
b = a>>1; 表示將a中的補碼數據右移一位后給b,左側補1(算術右移),最低位丟棄.
Ps:
有符號類型的最高位為1;?
5.關系運算
關運算的結果是一個邏輯值,表示判斷結果的真假,0為假,1為真,非零即真?
< ?> ?<= ?>=?
a = 5>6 ;假,a = 0;
a = 6>5; 真,a = 1;
== ?!= ?
6.位運算
& ?| ?^?
位&: 按位與,兩者都為1,則結果為1
x & 1 ?==>x 不變
x & 0 ?==>0 清零
位或|:按位或,兩者都為0,則結果為0
x | 1 ==>1 ?置一
x | 0 ==>x ?不變
異或^:按位異或,兩者不同,則結果為1;
x ^ 1 ==>~x 取反
x ^ 0 ==>x ?不變
交換兩個數:
int a = 5, b = 7;
a = a^b;
b = a^b;
a = a^b;
7.邏輯運算
結果為真假值
&& 邏輯與 ??
表達式1 && 表達式2 ?表達式1和表達式2都為真則為真.
短路現象:
表達式1為假,則整個表達式為假,不會判斷表達式2
(表達式1)+(表達式2) ://表達式1和2的運算符都是+,等級相同,沒有先后順序,由編譯器決定
(表達式1)&&(表達式2)://對于&&,存在求值順序,即先計算表達式1。
|| ?邏輯或?
表達式1 || 表達式2 ? 表達式1或表達式2只要有一個為真則為真.
0 || ?1 ? 1?
1 || ?0 ? 1?
0 || ?0 ? 0?
1 || ?1 ? 1?
短路現象:
表達式1 || 表達式2 表達式1為假才繼續判斷表達式2?
! ? 邏輯非
!(表達式) ? 真變假,假變真
優先級表:
優先級:
是為了解決 不同運算符 之間的資源歸屬問題,變量總是和優先級高的結合成一個整體;
a + b * c //b和*結合成b*c構成一個整體==> a + (b*c)
結合性:
是為了解決 相同運算符之間的資源歸屬問題.
a = 1, b = 2, c = 3;
a = b = c;//=結合性自右向左,b屬于右邊的等于號,構成一個整體.
a+b+c;
(a+b)+c;?
求值順序:
解決單個運算符運算時,左右表達式執行先后順序的.(一下三個運算符是有求值順序的:
&&, ||, a?b:c)
(表達式1) && (表達式2); //求值順序決定了表達式1先算.
a?b:c; //表達式a先算,然后再判斷執行b或則c
(表達式1) + (表達式2); //表達式1和表達式2,先后順序不確定.
預習:
條件運算符
輸入和輸出函數
1.自動轉換:
運算過程中,運算符兩邊類型不相同就會自動轉成較大的類型進行運算.
2.賦值轉換:
賦值運算的過程中產生的轉換,=號左右兩邊的類型不相同,則發生轉換.
char ? int ? ?float ? ?double
char <-->int?
int --> char ?4B -->1B
char類型只有一個字節,int有四個字節,賦值時直接將int的內存的低一個字節截斷給char 變量;
char --> int?
將一個字節賦值給4個字節,直接將char的8位復制給int的低8位,高24位采取補0或補1的方法.
有符號類型的最高位為1,則24位補1.其他情況都補0;這樣能保證數據變量.
int ?<-->float?
float --> int?
直接將float的整數部分賦值為int變量,小數丟棄.要保證整數部分不能超出int的范圍.
int ?a ?= 3.14159; ?//a = 3;
int ?--> float?
數據不變,改變數據的存儲方式為float的方式.數據的精度可能會丟失。
float <-->double?
float --> double?
數據不變,改變數據的存儲方式.
double --> float?
數據盡量不變,改變數據存儲方式.可以直接將double的十進制數據截取前面7位有效數據給float變量.
如果數據過大,報溢出錯誤,inf
3.強制轉換:
按照開發者的需求進行指定的轉換.
轉換格式:
(目標類型)變量;
float a 2.5;
2+(int)a
運算符:
表達式:
運算符表:
優先級
結合性
1.老大
()、[]、
2.單目:
++、--自加 自減。
a = 5;
b = a++; ?//先賦值后自加,b = a, a++ 之后b==5, a==6;
a = 5;
b = ++a; ?//先++,后賦值 ?++a, b=a ? 之后b==6, ? a==6
int a = 5, b = 7, c;
c = a++ + b; ?//12 期望值:a+期望得到另一個+ 。
c = a++ + ++b; //13?
a = 5;
c = a++ + a++ + a++;
sizeof() ?倫家是運算符,不是函數,求類型或變量占用內存大小
int a = 668;
sizeof(int) ==> 4; //int在內存中的大小為4個字節
sizeof (a) ==> ?4; //a在內存中占用4個字節
3.算術
* ? 乘法
/ ? (除法或取整) 除法兩邊都是整數,則進行取整運算. 否則進行除法運算
5/2 ==> 2 ? 2/5 ==> 0
5/2.0 ? ==> 2.500000
1.0*7/2 ==> 3.500000
7/2*1.0 ==> 3.000000?
% 求余/求模運算 (左右操作數必須為整數)
5%2 ==> 1?
3%5 ==> 3
+
-
4.位移運算 --(位操作是對內存的直接操作)
<<
char a = 0x1;
b = a<<1; 表示將a中的數據左移一位后給b,后邊補0,最高位丟棄.
左移N位,相當于乘以2的N次方(數據不丟失)
>>
char a = 0x60;
b = a>>1 表示將a 中的數據右移一位后給b,左側補0,最低位丟棄.
右移相當于除以2(數據位不可丟失)
char a = -4;
b = a>>1; 表示將a中的補碼數據右移一位后給b,左側補1(算術右移),最低位丟棄.
Ps:
有符號類型的最高位為1;?
5.關系運算
關運算的結果是一個邏輯值,表示判斷結果的真假,0為假,1為真,非零即真?
< ?> ?<= ?>=?
a = 5>6 ;假,a = 0;
a = 6>5; 真,a = 1;
== ?!= ?
6.位運算
& ?| ?^?
位&: 按位與,兩者都為1,則結果為1
x & 1 ?==>x 不變
x & 0 ?==>0 清零
位或|:按位或,兩者都為0,則結果為0
x | 1 ==>1 ?置一
x | 0 ==>x ?不變
異或^:按位異或,兩者不同,則結果為1;
x ^ 1 ==>~x 取反
x ^ 0 ==>x ?不變
交換兩個數:
int a = 5, b = 7;
a = a^b;
b = a^b;
a = a^b;
7.邏輯運算
結果為真假值
&& 邏輯與 ??
表達式1 && 表達式2 ?表達式1和表達式2都為真則為真.
短路現象:
表達式1為假,則整個表達式為假,不會判斷表達式2
(表達式1)+(表達式2) ://表達式1和2的運算符都是+,等級相同,沒有先后順序,由編譯器決定
(表達式1)&&(表達式2)://對于&&,存在求值順序,即先計算表達式1。
|| ?邏輯或?
表達式1 || 表達式2 ? 表達式1或表達式2只要有一個為真則為真.
0 || ?1 ? 1?
1 || ?0 ? 1?
0 || ?0 ? 0?
1 || ?1 ? 1?
短路現象:
表達式1 || 表達式2 表達式1為假才繼續判斷表達式2?
! ? 邏輯非
!(表達式) ? 真變假,假變真
優先級表:
優先級:
是為了解決 不同運算符 之間的資源歸屬問題,變量總是和優先級高的結合成一個整體;
a + b * c //b和*結合成b*c構成一個整體==> a + (b*c)
結合性:
是為了解決 相同運算符之間的資源歸屬問題.
a = 1, b = 2, c = 3;
a = b = c;//=結合性自右向左,b屬于右邊的等于號,構成一個整體.
a+b+c;
(a+b)+c;?
求值順序:
解決單個運算符運算時,左右表達式執行先后順序的.(一下三個運算符是有求值順序的:
&&, ||, a?b:c)
(表達式1) && (表達式2); //求值順序決定了表達式1先算.
a?b:c; //表達式a先算,然后再判斷執行b或則c
(表達式1) + (表達式2); //表達式1和表達式2,先后順序不確定.
預習:
條件運算符
輸入和輸出函數
總結
- 上一篇: C 语言基础语法1
- 下一篇: 数组、字符串及字符串相关函数