文章目錄
- 了解什么是操作數、操作符
- 操作數:
- 操作符
- 操作符詳解:
- 1.算術操作符: + 、- 、* 、/ 、%
- 2.移位操作符: << >>
- 3.位操作符: & | ^
- 4. 賦值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
- 5. 單?操作符: !、++、--、&、*、+、-、~ 、sizeof、(類型)
- 6.關系操作符: > 、>= 、< 、<= 、 == 、 !=
- 7. 邏輯操作符: && 、||
- 8. 條件操作符: ? :
- 9. 逗號表達式: ,
- 10. 下標引?: []
- 11. 函數調?: ()
- 12.結構體成員訪問符
- 操作符的優先級與結合性
- 優先級
- 結合性
- 優先級與結合性表
- 整形提升
- 算術轉換
了解什么是操作數、操作符
操作數:
操作數是用于運算的數字或者表達式
如:
1 . 1+1
2.(a+b)*3
操作符
操作符,也稱運算符。是對數據進行操作處理的符號。
操作符有很多,常見操作符有:單目操作符、算數操作符、移位操作符、位操作符、賦值操作符、關系操作符、邏輯操作符、條件操作符、逗號表達式、下標引用、函數調用和結構體成員。
操作符詳解:
1.算術操作符: + 、- 、* 、/ 、%
+、- 、* 、/ 、% 這些算術操作符分別對應數學上的加、減、乘、除、取余數
如:
int main() {int a = 10, b = 4;printf("a+b=%d\n", a + b);//加printf("a-b=%d\n", a - b);//減printf("a*b=%d\n", a * b);//乘printf("a/b=%d\n", a / b);//除printf("a%b=%d\n", a %b);//取余數return 0;
}
運行結果:
注:除號 / ,因為求的結果是整數,舍掉小數點后面的數,所以10/4=2
2.移位操作符: << >>
這我在之前的文章講過,這里放個鏈接需要的可以去看看哦:http://t.csdnimg.cn/JL6ao
3.位操作符: & | ^
這我在之前的文章講過,這里放個鏈接需要的可以去看看哦:http://t.csdnimg.cn/JL6ao
4. 賦值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
賦值操作符 =
當我們要對變量初始化時或者給變量賦一個值時就可以使用(注:這不是我們數學上的等于號噢)
如:
int main() {int a = 10;//初始化,將10賦給aint b;b = 20;//賦值,將20賦給bprintf("a=%d b=%d", a,b); return 0;
}
運行結果:
連續賦值:
如:
int main() {int a,b;a = b = 10;//將10賦給b,再將b賦給aprintf("a=%d b=%d", a, b);return 0;
}
運行結果:
注意的是在初始化時不能進行連續賦值 如:int a = b = 10;//err
運行會報錯,如:
復合賦值
就是將原來運算的過程簡化,如:
int main() {int a = 10;int b = 20;a += b;//等于a+bprintf("%d", a);return 0;
}
運行結果:
不僅能和 +,還能和 -、*、/等操作符一起復合使用
5. 單?操作符: !、++、–、&、*、+、-、~ 、sizeof、(類型)
- 在c語言中規定0為假,非0為真
- ! 邏輯取非運算符:在判斷條件時使用,如:(!真 ) 那么它的結果就為假
如:
int main() {int a = 1;if (!3) {printf("a為0");}elseprintf("a不為0");return 0;
}
運行結果:
++
++分為前置++和后置++
區別:前置++是先+1再使用,后置++是先使用后++
如:
int main() {int a = 2;int b = 2;printf("a=%d\n", a++);//后置++,先使用,所以這里a的值不變 打印 a=2printf("b=%d", ++b);//前置++,先+1,后使用,所以這里打印b=3return 0;
}
運行結果:
** – **
–分為前置–和后置–
區別:前置–是先-1再使用,后置–是先使用后–
如:
int main() {int a = 2;int b = 2;printf("a=%d\n", a--);//后置--,先使用,所以這里打印 a=2printf("b=%d", --b);//前置--,先-1,后使用,所以這里打印b=1return 0;
}
運行結果:
取地址操作符&
用于取變量在內存中的地址
如:
int main() {int a = 10;printf("%p", &a);//取出a的地址,%p用于打印地址return 0;
}
運行結果:
解引用操作符 ( * )
( * )用于指針 ,放在指針變量的前面,如:*p,*p通過指針變量p中存放的地址,找到指向的空間
如:
int main() {int a = 10;int* p = &a;*p = 5;//通過解引用符來找到p指向的空間,此時*p==a,改變*p即改變aprintf("a=%d", a);return 0;
}
運行結果:
+、-
這個并不是算術運算符的 +、 -,而是取正負的操作符,+(正)、-(負)。
如:
int main() {int a = 10;printf("+a=%d\n", +a);//a不變printf("-a=%d\n", -a);//a等于-10return 0;
}
運行結果:
~按位取非
運算規則:將一個操作數全部取反(在二進制的基礎上取非),不懂原碼、反碼、補碼、進制的可以看看這個鏈接的內容:http://t.csdnimg.cn/JL6ao
如:將int a=1取反
sizeof()
計算變量的所占內存空間大小,單位是字節,如果操作數是類型的話,計算的是使用類型創建的變量的所占空間的大小
如:
int main() {int a = 10;int arr[10];printf("%d\n", sizeof(a));//變量printf("%d\n", sizeof(int));//類型printf("%d\n", sizeof(arr));//在計算數組大小時在()輸入數組名即可return 0;
}
int類型的字節大小為4字節,arr[10],為10個int型的數據所以為40
(類型)
()強制類型轉換,如(int)9.8,將浮點數轉化為整數
如:
int main() {double a = 9.8;printf("%d\n",(int)a);//return 0;
}
運行結果:
轉化之后舍掉小數
6.關系操作符: > 、>= 、< 、<= 、 == 、 !=
. > 、>= 、< 、<= 、 == 、 !=,這些符號分別是大于、大于等于、小于、小于等于、等于、不等于
注意:>=、<=這兩是規定的寫法,不要寫成=<、=>這種形式
主要用于判斷表達是的真假
如:
int main() {int a = 0, b = 10;if (a<b) {//這里b大于a,表達式為真,執行下面語句printf("a<b");}return 0;
}
運行結構:
7. 邏輯操作符: && 、||
邏輯與操作符 &&:
1.簡單來說就是并且的意思,判斷兩個表達式若都為真則為真,有一個或者都為假則為假
2.有個特點就是當判斷第一個表達式為假時,就不會判斷后面的了,直接判斷為假
如:
int main() {int a = 0, b = 2;if (a && b) {printf("yes");}elseprintf("no");return 0;}
運行結果:
這里a=0,當判斷a=0時,就不會去判斷b了,這里直接就為假了
邏輯或操作符 ||:
1.可以簡單理解為或者,判斷兩個表達式中有一個為真則為真,當兩個表達式都為假時才判斷為假
2.當判斷第一個表達式為真時就不會判斷后面的表達式了,直接判斷為真
如:
int main() {int a = 0, b = 2;if (b || a) {printf("yes");}elseprintf("no");return 0;
}
運行結果:
這里當判斷b為真時就不會進行后面的判斷了,直接判斷為真
8. 條件操作符: ? :
條件操作符:
1.? : 為三目運算符
2. 格式:int c = (a > b)?a:b;//(表達式1)?(表達式2):(表達式3)
3.當表達式1為真時就會執行表達式2,當表達式1為假時就會執行表達式3
如:
int main() {int a = 0, b = 2;int c = (a > b)?a:b;//(表達式1)?(表達式2):(表達式3)printf("%d", c);return 0;
}
運行結果:
這里表達式1為假所以執行表達式3,將b賦給c
9. 逗號表達式: ,
逗號表達式:
1.格式:
c int d = a, b, c;//()表達式1),(表達式2),(表達式3)......,已最后一個為標準
2.逗號表達式,就是?逗號隔開的多個表達式。
3.逗號表達式,從左向右依次執?。整個表達式的結果是最后?個表達式的結果。
如:
i
nt main() {int a = 0, b = 2;int c = 10;int d =(a++,b=a+b, c+b);//a++,a=1,b=a+b=3,c+b=13, d=13printf("%d", d);return 0;
}
運行結果:
10. 下標引?: []
下標引?:
1.格式:
arr [ a ]//arr為數組名,a為下標(索引值)
2.用于找到數組具體位置的值
如:
int main() {int arr[] = { 1,2,3 };printf("%d", arr[1]);//arr[1]=2;return 0;
}
運行結果:
11. 函數調?: ()
函數調?:
1.接受?個或者多個操作數:第?個操作數是函數名,剩余的操作數就是傳遞給函數的參數。
2.add()//add(函數名)為第一個操作數,()里可以放0個或者多個操作數(參數)
如:
int add(int x, int y) {return x + y;
}
int main() {int a = 10;int b = 5;int c = add(a, b);//add,a,b都為操作數printf("%d", c);return 0;
}
運行結果:
12.結構體成員訪問符
直接訪問: .
格式:結構體名 . 成員名
p.a
如:
struct tag {int a;int b;
};
int main() {struct tag p = { 5,10 };printf("a=%d b=%d", p.a,p.b);return 0;
}
運行結果:
間接成員訪問符:->
1.有時候我們得到的不是?個結構體變量,?是得到了?個指向結構體的指針,這時就要用到 ->
2.格式:結構體指針->成員名 p1->a
如:
struct tag {int a;int b;
};
int main() {struct tag p= { 5,10 };struct tag* p1 = &p;printf("a=%d b=%d", p1->a,p1->b);return 0;
}
運行結果:
13.圓括號()
將括號內的看成一個整體,先算完括號內在算其他,在不確定優先級時可以用
操作符的優先級與結合性
優先級
簡單來說就是先運算那一部分,和我們學的加減乘除意思差不多,在有加法和乘法的情況下,先算乘法再算加法
如:
int main() {int a = 10, b = 2;int c = b + -a * b;//這里有 -(負號) + * 三種運算符printf("c=%d" ,c);return 0;
}
因為 優先級 -(負號)> * >+,所以先算-a=-10,再-10 * b=-20,最后再加2,所以c=-18
運行結果:
結合性
簡單來說就是操作數與操作符之間誰和誰先在一起,分為自左向右和自右向左兩個方向
如:
int c = a + b;
- 是左向右結合:先跟a結合在與b,=賦值運算符是右向左結合,先跟(a+b)結合,再與c結合
優先級與結合性表
規律:
優先級有上到下遞減
整形提升
什么是整形提升:
1.C語?中整型算術運算總是?少以缺省整型類型的精度來進?的。
2.為了獲得這個精度,表達式中的字符和短整型操作數在使?之前被轉換為普通整型,這種轉換稱為整型提升。
意義:
1.表達式的整型運算要在CPU的相應運算器件內執?,CPU內整型運算器(ALU)的操作數的字節?度?般就是int的字節?度,同時也是CPU的通?寄存器的?度。因此,即使兩個char類型的相加,在CPU執?時實際上也要先轉換為CPU內整型操作數的標準?度。通?CPU(general-purpose CPU)是難以直接實現兩個8?特字節直接相加運算(雖然機器指令中可能有這種字節相加指令)。所以,表達式中各種?度可能?于int?度的整型值,都必須先轉換為int或unsigned
int,然后才能送?CPU去執?運算。
2.通過整形計算完后會進行截斷
3.有符號和無符號在一起時,有符號轉為無符號計算
4.char、short,轉為int計算,就算完后截斷
如何提升
- 有符號整數提升是按照變量的數據類型的符號位來提升的
- ?符號整數提升,?位補0
如:
int mian() {char a = -1;//有符號unsigned char b = -1;//無符號printf("a=%d\nb=%d", a, b);return 0;
}
char a=1
unsigned char b = -1
運行結果:
再如:
char a=1 ,char b=-2,計算a+b
int main() {char a = 1;char b = -2;unsigned char c = a + b;printf("a+b=%d,c=%d", a+ b,c);return 0;
}
運行結果:
short也是如此,感興趣的可以去試試
算術轉換
如果某個操作符的各個操作數屬于不同的類型,那么除?其中?個操作數的轉換為另?個操作數的類型,否則操作就?法進?。下?的層次體系稱為尋常算術轉換。
long double
double
float
unsigned long int
long int
unsigned int
int
如果某個操作數的類型在上?這個列表中排名靠后,那么?先要轉換為另外?個操作數的類型后執?運算
如:
int main() {double a = 9.8;int b=3;printf("%lf", a + b);return 0;
}
運行結果:
這里打印double類型的數,所以編譯器會將a轉為double類型的計算
以上就是我的分享了,如果由有錯誤的地方,歡迎在評論區留言
最后 謝謝大家的觀看!