初識結構體,整型提升及操作符的屬性

目錄

  • 一、結構體成員訪問操作符
  • 1.1 結構體
  • 二、操作符的屬性:優先級、結合性
    • 2.1 優先級
    • 2.2 結合性
      • C 運算符優先級
  • 三、表達式求值
    • 3.1 整型提升
    • 3.2 算數轉化
  • 總結


一、結構體成員訪問操作符

1.1 結構體

C語言已經提供了內置類型,如:char,short,int,long,float,double等,但是只有這些內置類型還是不夠的,假設我想描述學生,描述一本書,這時單一的內置類型是不行的。

描述一個學生需要名字,年齡,學號,身高,體重等

描述一本書需要作者,出版社,定價等。C語言為了解決這個問題,增加了結構體這種自定義的數據類型,讓程序員可以自己創造適合的類型。

注:結構是一些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量,如:標量、數組、指針,甚至是其他結構體。

這里可以和數組相比較

數組:是一組相同類型的元素的集合

struct tag
{member-list;
}variable-list;//變量列表

這里的member-list可能有多個值,值叫成員變量。variable-list變量列表可有可無。

//聲明了一個結構體類型
struct Stu
{//1個或多個成員 - 這些成員都是用來描述學生的char name[20];int age;char id[11];float score;//...
} s6,s7,s8;//全局變量

其大體形式就如圖示代碼,s6,s7,s8就是變量列表,其相當于在聲明類型的時候順便創建了幾個變量,相當于全局變量,也可以不寫,在下面單獨創建。

//聲明了一個結構體類型
struct Stu
{//1個或多個成員 - 這些成員都是用來描述學生的char name[20];int age;char id[11];float score;//...
} s6,s7,s8;//全局變量,聲明類型的同時定義s6,s7,s8struct Stu s4;//全局變量,定義結構體變量s4
struct Stu s5;//全局變量int main()
{int num = 0;struct Stu s1 = {"zhangsan", 20, "2024010102", 85.5f};struct Stu s2 = {.age=18, .name="wangcai",.score=95.5f,.id = "2025010102"};//指定順序初始化struct Stu s3;//局部變量return 0;
}

在這里插入圖片描述
編譯器在默認情況下會將85.5認定為double類型,所以要加一個f,搞成float類型。

而且在默認情況下,結構體的初始化變量只能按順序初始化,即按結構體的聲明順序來創建,如果想要指定初始化順序,就要使用操作符(.)來訪問結構體成員了。
使用方法:結構體變量.成員名

結構體也可以嵌套使用,即在結構體中引用結構體:

//聲明了一個結構體類型
struct Peo
{char name[30];int age;char tele[12];
};struct Ebook
{struct Peo data[100];//可以存放100個人的信息int count;//當前已經存的個數
};int main()
{struct Peo p1 = {"zhangsan", 20, "15598888888"};struct Ebook eb = { {{"wangwu", 19, "13396668866"},{"cuihua", 18, "18696866688"}},  0};//printf("%s\n", p1.name);//printf("%d\n", p1.age);//printf("%s\n", p1.tele);printf("%s\n", eb.data[1].name);printf("%d\n", eb.data[1].age);printf("%s\n", eb.data[1].tele);//. : 結構成員訪問操作符//結構體變量.結構體成員return 0;
}

這里也不太好說,直接看監視窗格就懂了:
在這里插入圖片描述
在這里插入圖片描述


二、操作符的屬性:優先級、結合性

C語言的操作符有兩個重要的屬性:優先級、結合性,這兩個屬性決定了表達式求值的計算順序。

2.1 優先級

優先級指的是,如果一個表達式包含多個運算符,哪個運算符應該優先執行。各種運算符的優先級是不一樣的。

3 + 4 *5

該示例中,表達式3+45里既有加法運算符,又有乘法運算符。由于乘法的優先級高于加法,所以會先計算45,而不是先計算3+4.

2.2 結合性

如果兩個運算符優先級相同,優先級沒辦法確定先計算哪個了,這時候就需要看結合性了,則根據運算符是左結合,還是右結合,決定執行順序。大部分運算符是左結合(從左到右執行),少數運算符是右結合(從右向左執行),比如賦值運算符(=)

5 * 6 / 2

該示例中,*和/的優先級相同,他們都是左結合運算符,所以從左到右執行,先計算5×6,再計算/2。

運算符的優先順序很多,下面是部分運算符的優先級順序(按照優先級從高到低排列)

  • 圓括號(())
  • 自增運算符(++),自減運算符(–)
  • 單目運算符(+和-)
  • 乘法(*),除法(/)
  • 加法(+),減法(-)
  • 關系運算符(<、>等)
  • 賦值運算符(=)

補充:圓括號的優先級是最高的,可以使用它來改變其他運算符的優先級。

C 運算符優先級

優先級運算符描述結合性
1++ –
()
[]
.
->
(type){list}
后綴/后置自增和自減
函數調用
數組下標
結構體和共用體成員訪問
通過指針訪問結構體和共用體成員
復合字面量[C99]
從左到右
2++ –
+ -
! ~
(type)
*
&
sizeof
_Alignof
前綴自增和自減[注釋1]
單目正負
邏輯非和按位取反
強制類型轉換
間接訪問(解引用)
取地址
求大小[注釋2]
對齊要求[C11]
從右到左
3* / %乘法、除法和取余從左到右
4+ -加法和減法從左到右
5<< >>按位左移和右移從左到右
6< <=用于關系運算符 < 和 ≤ (分別對應)-
7> >=用于關系運算符 > 和 ≥ (分別對應)-
8== !=用于關系運算符 ==(等于)和 !=(不等于) (分別對應)-
9&按位與-
10^按位異或(獨占或)-
11|按位或(包含或)-
12&&邏輯與-
13||邏輯或-
14?:條件運算符[注釋3]從右到左
15[注釋4]=
+= -=
*= /= %=
<<= >>=
&= ^= |=
簡單賦值
加法賦值、減法賦值
乘法賦值、除法賦值、取余賦值
按位左移賦值、按位右移賦值
按位與賦值、按位異或賦值、按位或賦值
-
16,逗號從左到右

三、表達式求值

3.1 整型提升

C語言中整型算術運算總是至少以默認整型類型的精度來進行的。

為了獲得這個精度,表達式中的字符和短整型操作數在使用之前被轉換為普通整型,這種轉換稱為整型提升

整型提升的意義
表達式中的整型運算要在CPU的響應運算器件內執行,CPU整型運算器(ALU)的操作數的字節長度一般就是int的字節長度,同時也是CPU的通用寄存器的長度。
因此,即使兩個char類型的相加,在CPU執行時實際上也要先轉換為CPU內整型操作數的標準長度。
通用CPU(general-purpose CPU)是難以直接實現兩個8比特字節直接相加運算(雖然極其指令中可能有這種字節相加指令)。所以,表達式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執行運算。

如何進行整型提升呢?

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

多說無益,拿例子來看:
在這里插入圖片描述
看到這串代碼,你的第一反應c的值是多少呢?
會不會是140呢?
哈哈我既然拿出來了,它當然就沒有那么簡單了,打印出的值是-116

首先排除140,因為char類型的取值范圍是:-128-127,他根本就存不下140,這里就要進行整型提升的操作:

首先這里20是int類型,4個字節要放到char里面去,char只有一個字節的空間,所以只能有8個比特位,這就需要截斷一部分了,這里是截斷高位,保留低位,這里a和b相加的時候要發生整型提升
在這里插入圖片描述
在我們當前的msvc編譯器下,char就是所謂的signed char,所以整型提升就按第一個走

過程展示

在這里插入圖片描述

因為這里%d注釋處的原因,加和起來的c也需要整型提升

3.2 算數轉化

如果某個操作符的各個操作數屬于不同的類型,那么除非其中一個操作數轉換為另一個操作數的類型,否則操作無法進行,下面的圖中的層次體系就稱為尋常算術轉換
在這里插入圖片描述
編譯器會根據內容自動轉換數據類型,是由小的類型向大的類型轉化,就如箭頭所指方向
在這里插入圖片描述
比如這里整型100+浮點型55.5,編譯器就會自動將整型100轉換為浮點型100,再進行相加和。


總結

雖然在這里已經有了操作符的優先級和結合性,但如果我們寫代碼的時候表達式過于復雜,計算結果的路徑不唯一,一串代碼同一函數多次調用,任有可能寫出問題代碼(因為調用的先后次序無從得知,不同編譯器下的計算次序可能不同),所以在平時寫代碼的時候,表達式還是建議多次拆分,簡單化更好。

這次決定把文章的重點內容設為標題看一看效果,因為前幾篇文章流量不太好,有點小傷心,希望喜歡作者文章的靚仔靚女多多點贊支持一下,你們的支持就是我最大的動力!

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

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

相關文章

JVM-內存結構

&#x1f9e9; 一、JVM內存五大核心結構詳解 &#x1f4cc; 1. 程序計數器&#xff08;Program Counter Register&#xff09; 特性說明作用記錄當前線程執行的字節碼行號指示器&#xff08;分支/循環/異常處理的核心&#xff09;線程私有? 每個線程獨立存儲指令位置異常? …

從 Revit 到 3DTiles:GISBox RVT 切片器如何讓建筑圖元在 Web 端展示

在GIS&#xff08;地理信息系統&#xff09;行業蓬勃發展的當下&#xff0c;數據處理與展示的效率和精準度成為關鍵。GISBox作為一款功能強大的一站式三維GIS數據編輯、轉換、發布平臺&#xff0c;憑借其獨特的“RVT切片器”功能&#xff0c;在RVT圖元處理方面也有著不俗的表現…

【Linux】為 Git 設置 Commit 提交模板方法,可統一個人或者項目的提交風格

為 Git 設置 Commit 提交模板 新建模板文件。注意之后不能刪除該文件。 gedit ~/.gitmessage.txt粘貼自己的模板。可以給 AI 提自己的需求&#xff0c;定制一個模板&#xff0c;例如 # <type>(<scope>): <description> # # [optional body] # # [optional…

Android第十二次面試GetX庫渲染機制

核心引擎&#xff1a;GetX / Obx 的魔法 .obs 是數據響應式化的關鍵操作&#xff0c;它將普通變量轉換為可觀察(Observable)對象&#xff1a; // 傳統變量 - 無法自動通知更新 int count 0; // 響應式變量 - 自動通知能力 var count 0.obs; // RxInt(0) Obx 是 UI ?響應式…

用 Whisper 打破沉默:AI 語音技術如何重塑無障礙溝通方式?

網羅開發 &#xff08;小紅書、快手、視頻號同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

ubuntu 添加應用到啟動菜單

使用Alacarte菜單編輯器 Alacarte是一個簡單易用的菜單編輯器&#xff0c;可以幫助用戶添加、刪除或編輯應用程序的啟動菜單項。 安裝Alacarte sudo apt-get install alacarte 執行alacarte alacarte 使用說明 選擇新建項目進行添加 "Name"欄填自定義的名稱&quo…

【學習筆記】構造函數+重載相關

【學習筆記】構造函數重載相關 一、構造函數 構造函數在創建對象的過程就會執行&#xff0c;帶參數與不帶參數&#xff0c;帶參數的構造函數會默認將成員變量賦值傳進去的參數。 class Layer { private:int layer_id; // 層IDstd::string layer_json; // 層的JSON配置…

6.6 計算機網絡面試題

描述一下打開百度首頁后發生的網絡過程 網頁非常慢轉圈圈的時候&#xff0c;要定位問題需要從哪些角度&#xff1f; server a和server b&#xff0c;如何判斷兩個服務器正常連接&#xff1f;出錯怎么辦&#xff1f; 服務端正常啟動了&#xff0c;但是客戶端請求不到有哪些原因?…

Java -jar命令運行外部依賴JAR包的深度場景分析與實踐指南

Java -jar命令運行外部依賴JAR包的深度場景分析與實踐指南 引言&#xff1a;外部依賴JAR的必要性 在Java應用部署中&#xff0c;java -jar命令是啟動可執行JAR包的標準方式。但當應用需要依賴外部JAR文件時&#xff08;如插件系統、模塊化部署、共享庫等場景&#xff09;&…

XHR / Fetch / Axios 請求的取消請求與請求重試

XHR / Fetch / Axios 請求的取消請求與請求重試是前端性能優化與穩定性處理的重點&#xff0c;也是面試高頻內容。下面是這三種方式的詳解封裝方案&#xff08;可直接復用&#xff09;。 ? 一、Axios 取消請求與請求重試封裝 1. 安裝依賴&#xff08;可選&#xff0c;用于擴展…

2025最新Java日志框架深度解析:Log4j 2 vs Logback性能實測+企業級實戰案例

一、為什么printStackTrace是"代碼墳場"&#xff1f; 你寫的日志可能正在拖垮系統&#xff01; 在Java開發中&#xff0c;直接調用printStackTrace()打印異常堆棧是最常見的"自殺式操作"。這種方式會導致三大致命問題&#xff1a; 無法分級控制&#xff…

前端面試四之Fetch API同步和異步

Fetch API&#xff08;Fetch Application Programming Interface&#xff09;是一個現代的、基于Promise的網絡請求接口&#xff0c;用于在瀏覽器環境中發起網絡請求并處理響應。它是對傳統XMLHttpRequest的改進&#xff0c;提供了更簡潔、靈活和強大的功能&#xff0c;廣泛應用…

ubuntu 20.04掛載固態硬盤

我們有個工控機&#xff0c;其操作系統是ubuntu 20.04。可以接入一個固態硬盤。將固態硬盤插好后&#xff0c;就要進行掛載。在AI的指導下&#xff0c;過程并不順利。記錄如下&#xff1a; 1、檢查硬盤是否被識別 安裝好硬盤后&#xff0c;運行以下命令來檢查Linux系統是否…

涂裝協作機器人:重新定義涂裝工藝的智能化未來

一、涂裝場景的產業變革與核心訴求 1.1 千億級市場的技術突圍戰 在汽車制造領域&#xff0c;涂裝車間被稱為"工業化妝間"&#xff0c;其工藝質量直接影響產品溢價能力。當前行業面臨三重挑戰&#xff1a; 質量維度&#xff1a;傳統人工噴涂存在膜厚波動15μm的行業…

Unity優化篇之DrawCall

當然可以&#xff01;以下是完整、詳盡、可發布的博客文章&#xff0c;專注講解 Unity 的靜態合批與動態合批機制&#xff0c;并詳細列出它們對 Shader 的要求和所有限制條件。文章結構清晰、技術深度足夠&#xff0c;適合發布在 CSDN、掘金、知乎等技術平臺。 urp默認隱藏動態…

Electron桌面應用下,在拍照、展示pdf等模塊時,容易導致應用白屏

Electron 應用白屏問題分析與解決方案 Electron 應用中拍照、PDF展示等模塊導致白屏的常見原因通常與內存泄漏、渲染進程崩潰或資源加載超時有關。以下是具體排查與解決方法&#xff1a; 檢查內存泄漏 項目中&#xff0c;分析代碼&#xff0c;高頻操作或未釋放的資源可能導致…

比對++Hex or Bin文件

用NotePad 安裝 ?? Hex-Editor 插件 1.1參考方法路徑https://cloud.tencent.com/developer/article/2311013 1.2 下載 Hex-Editor.dll文件路勁 https://sourceforge.net/projects/npp-plugins/ 比對 2.1, 顯示Bin 插件/Hex Editor/View in Hex 2.2 插件/Compare(運行很不流…

以STM32H7微控制器為例,簡要說明stm32h7xx_it.c的作用

在STM32開發中&#xff0c;stm32h7xx_it.c文件是中斷服務例程&#xff08;ISR, Interrupt Service Routine&#xff09;的核心實現文件&#xff0c;其作用與產生的邏輯如下&#xff1a; 一、文件的核心作用 中斷處理入口 該文件定義了STM32H7微控制器所有硬件中斷和異常的處理函…

若依框架頁面緩存查詢條件后,切換頁面想重新請求一下數據

因為框架使用了Keep-Alive緩存組件&#xff0c;所以使用onActivated鉤子 import { onActivated } from vue;// 當組件從緩存中重新激活時 onActivated(() > {getList(); });

智能心理醫療助手開發實踐:從技術架構到人文關懷——CangjieMagic情感醫療應用技術實踐

作為一名長期耕耘在醫療健康領域的技術開發者&#xff0c;我至今仍清晰地記得三年前那個深夜——當我調試的心理健康AI第一次對用戶的情緒崩潰做出恰當回應時&#xff0c;整個團隊爆發的歡呼聲。那一刻&#xff0c;我深刻意識到技術不只是冰冷的邏輯&#xff0c;更可以成為溫暖…