c語言-操作符詳解(含優先級與結合性)

文章目錄

    • 了解什么是操作數、操作符
      • 操作數:
      • 操作符
    • 操作符詳解:
      • 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、(類型)

  1. 在c語言中規定0為假,非0為真
  2. ! 邏輯取非運算符:在判斷條件時使用,如:(!真 ) 那么它的結果就為假

如:

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計算,就算完后截斷

如何提升

  1. 有符號整數提升是按照變量的數據類型的符號位來提升的
  2. ?符號整數提升,?位補0

如:

int mian() {char a = -1;//有符號unsigned char  b = -1;//無符號printf("a=%d\nb=%d", a, b);return 0;
}

char a=1
![在這里插入圖片描述](https://img-blog.csdnimg.cn/88f14fcb6cb24ac89fc98e357b08c30c.png

unsigned char b = -1
![在這里插入圖片描述](https://img-blog.csdnimg.cn/8c73603c71c94a08bbdf00f87228564c.png

運行結果:
在這里插入圖片描述
再如:
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類型的計算

以上就是我的分享了,如果由有錯誤的地方,歡迎在評論區留言
最后 謝謝大家的觀看!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160275.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LeetCode刷題】--39.組合總和

39.組合總和 本題詳解&#xff1a;回溯算法剪枝 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return r…

KyLin離線安裝OceanBase

去OceanBase下載若干文件 1 首先安裝ob-deploy-2.3.1-2.el7.x86_64.rpm rpm -ivh ob-deploy-2.3.1-2.el7.x86_64.rpm# 運行此命令的時候他會報錯 RPM should not be used directly install RPM packages, use Alien instead! 這個需要用Alien去轉換為deb的包&#xff0c;不…

MethodArgumentNotValidException 與 ConstraintViolationException

MethodArgumentNotValidException 和ConstraintViolationException 都是用于處理參數校驗異常的異常類&#xff0c;但它們在不同的上下文中使用。 1. MethodArgumentNotValidException&#xff1a; - MethodArgumentNotValidException 是在 Spring MVC 或 Spring Boot 中處…

一篇五分生信臨床模型預測文章代碼復現——Figure 10.機制及腫瘤免疫浸潤(六)

之前講過臨床模型預測的專欄,但那只是基礎版本,下面我們以自噬相關基因為例子,模仿一篇五分文章,將圖和代碼復現出來,學會本專欄課程,可以具備發一篇五分左右文章的水平: 本專欄目錄如下: Figure 1:差異表達基因及預后基因篩選(圖片僅供參考) Figure 2. 生存分析,…

windows系統玩游戲找不到d3dx9_35.dll缺失的解決方法

分享一個我們在打開游戲或許軟件過程中遇到的問題——“由于找不到d3dx9_35.dll,無法繼續執行代碼”的五個修復方案。這個問題可能會影響到我們的工作和娛樂效率&#xff0c;甚至可能導致工作的延期。因此&#xff0c;我希望通過今天的文章&#xff0c;能夠幫助大家更好地解決這…

電大搜題——打開學習之門的最佳選擇

在快節奏的現代社會&#xff0c;追求知識和學習成為愈發重要的需求。然而&#xff0c;許多人由于時間和機會的限制&#xff0c;無法實現自己的教育夢想。就在這個時候&#xff0c;安徽開放大學廣播電視大學通過推出電大搜題微信公眾號&#xff0c;為廣大學子提供了一個便捷高效…

別低頭,皇冠會掉;別流淚,賤人會笑。

別低頭&#xff0c;皇冠會掉&#xff1b;別流淚&#xff0c;賤人會笑。

從零開始學習typescript——類型轉換

類型轉換 在開發中&#xff0c;你有沒有遇見一種情況 let obj{displayNum:"" } obj.displayNum“123”; let num:number 123 console.log(numobj.displayNum) //false我們想要的結果&#xff0c;是結果為true;那么這時候就要用到類型轉換 將其他類型轉換為布爾類型…

18.天氣小案例

1?新增帶Layout組件的頁面 直接在views文件夾下面新增weather.vue。然后隨便寫一個123&#xff0c;現在先讓我們頁面能跳過去先。 讓頁面能跳過去&#xff0c;有好幾種方法&#xff1a; 1、在菜單管理自己添加一個菜單&#xff0c;然后把菜單分配給某個角色&#xff0c;再把…

詳解StringBuilder和StringBuffer(區別,使用方法,含源碼講解)

目錄 一.為什么要使用StringBuilder和StringBuffer 字符串的不可變性 性能損耗 二.StringBuilder和StringBuffer StringBuffer源碼講解 使用方式 三.常用方法總結 示例&#xff1a; 四.StringBuilder和StringBuffer的區別 一.為什么要使用StringBuilder和StringBuffe…

C語言--每日五道選擇題-- Day22

第一題&#xff08;注意&#xff09; 1.下列 C 代碼中&#xff0c;不屬于未定義行為的有&#xff1a;______。 A&#xff1a;int i0; i(i); B&#xff1a;char *p"hello"; p[1]E; C&#xff1a;char *p"hello"; char ch*p; D&#xff1a;int i0; printf(&q…

Redis7--基礎篇3(持久化)

持久化介紹 官網地址&#xff1a; https://redis.io/docs/manual/persistence RDB(Redis DataBase)AOF(Append Only File)RDB AOF RDB模式(Redis DataBase) RDB 持久性以指定的時間間隔執行數據集的時間點快照。 實現類似照片記錄效果的方式&#xff0c;就是把某一時刻的數據…

計算機組成原理(萬字爆肝整理)

第一章 計算機系統概述 “較簡單&#xff0c;不做過多贅述&#xff0c;后面會詳細學到” 第一節 計算機系統層次結構 1.計算機系統的基本組成&#xff1a;硬件軟件 2.計算機硬件的基本組成&#xff1a;運算器存儲器控制器輸入設備輸出設備 3.系統軟件和應用軟件 系統軟件…

expdp導出分區表緩慢排查(Streams AQ: waiting for messages in the queue )

基本信息 單機&#xff0c;從老環境遷移到19.19。之前的導出速度接受范圍內。硬件是提升的 導出使用了壓縮&#xff0c;加密&#xff0c;并行64進程&#xff0c;表分區約90個&#xff0c;無lob字段。 現象 導出開始時能并行導出&#xff08;并行約45個&#xff0c;沒起到64…

Cypress環境變量

Cypress環境變量 baseUrl 當你配置了 baseUrl &#xff0c;測試套件中的 cy.visit() 、 cy.request() 都會自動以 baseUrl 的值作為前綴并且&#xff0c;當你需要訪問某些網址或者發起接口請求時&#xff0c;在代碼中就可以不用再指定請求的 host 或者 url 了 如何配置 base…

Java進階——多線程相關,實際應用中的積累,持續更新

目錄 多線程相關CountDownLatch賽跑的案例countDownLatch.await(300, TimeUnit.SECONDS); Java其他進階Map的put方法只放一個元素的集合 多線程相關 CountDownLatch 案例&#xff1a;主線程的執行需要等待子線程執行完&#xff0c;等各個線程執行完畢后&#xff0c;主線程做收…

redis的高可用(主從復制和哨兵模式)

redis的高可用&#xff08;主從復制和哨兵模式&#xff09; redis的性能管理&#xff1a;redis的數據緩存在內存當中 INFO memory&#xff1a;查看redis內存使用情況 used_memory:1800800&#xff1a;redis中數據占用的內存 used_memory_rss:5783552&#xff1a;redis向操作…

Halcon Solution Guide I basics(3): Region Of Interest(有興趣區域/找重點)

文章目錄 文章專欄前言文章解讀前言創建ROI案例1&#xff1a;直接截取ROI手動截取ROI 總結ROI套路獲取窗口句柄截取ROI區域獲取有效區域 Stop組合 文章專欄 Halcon開發 Halcon學習 練習項目gitee倉庫 CSDN Major 博主Halcon文章推薦 前言 今天來看第三章內容&#xff0c;既然是…

QTableWidget——編輯單元格

文章目錄 前言熟悉QTableWiget&#xff0c;通過實現單元格的合并、拆分、通過編輯界面實現表格內容及屬性的配置、實現表格的粘貼復制功能熟悉QTableWiget的屬性 一、[單元格的合并、拆分](https://blog.csdn.net/qq_15672897/article/details/134476530?spm1001.2014.3001.55…

Docker實踐筆記7:構建MySQL 8鏡像

使用Docker構建MySQL 8鏡像并運行容器 本教程將指導您使用Dockerfile構建和運行一個MySQL 8容器。讓我們開始吧&#xff01; 步驟1&#xff1a;創建Dockerfile 在您的項目根目錄下創建一個名為Dockerfile的文件。以下是Dockerfile的示例內容&#xff1a; # 基于最新的MySQL…