C++ 17 允許在 for 循環,if 語句,switch 語句中初始化變量

看到 c++ 有這個特性,python 和 java 似乎都沒有,根據 AI 的回答進行了一些整理總結。

文章目錄

    • **1. 在 `for` 循環中初始化變量**
      • **特點**
      • **多個變量初始化**
    • **2. 在 `if` 語句中初始化變量(C++17 及以上)**
      • **示例**
      • **特點**
    • **3. 在 `switch` 語句中初始化變量(C++17 及以上)**
      • **特點**
    • **4. `while` 語句不支持變量初始化**
    • **5. `for` 語句的尾端變量初始化(C++17)**
      • **特點**
    • **6. C++17 變量初始化的優勢**
    • **7. 總結**
      • ? **適用的語法(C++17 及以上)**
      • ? **C++17 變量作用域優化的好處**

在 C++ 中,允許在 for 循環和 if 語句、switch 語句中初始化變量,這是 C++17 引入的一項重要特性,稱為 “語句作用域變量”

這不僅提高了代碼的可讀性,還能減少變量的作用域,避免不必要的變量污染。

1. 在 for 循環中初始化變量

for 語句的第一部分,我們通常用它來初始化循環變量

for (int i = 0; i < 5; i++) {std::cout << i << " ";
}

特點

  • int i = 0; 作用域僅限于 for 語句,不會影響外部作用域。
  • i 在循環結束后不可用
    std::cout << i;  // ? 錯誤:i 在此作用域不可見
    

多個變量初始化

for (int i = 0, j = 10; i < j; i++, j--) {std::cout << "i = " << i << ", j = " << j << std::endl;
}

特點:

  • ij 作用域僅限于 for 語句,在 for 之外不可見。
  • 適用于兩個變量協同控制循環

2. 在 if 語句中初始化變量(C++17 及以上)

C++17 允許在 if 語句中初始化變量,使變量的作用域僅限于該 if 語句及其 else 塊,避免污染外部作用域。

示例

if (int x = 10; x > 5) { // 在 if 語句中聲明 xstd::cout << "x is greater than 5: " << x << std::endl;
} else {std::cout << "x is 5 or less: " << x << std::endl;
}// std::cout << x; // ? 錯誤:x 在此作用域不可見

特點

  • x 只在 ifelse 塊內有效,超出作用域后會被銷毀
  • 避免變量作用域污染,提高代碼安全性

3. 在 switch 語句中初始化變量(C++17 及以上)

C++17 也允許在 switch 語句的條件部分聲明變量:

switch (int n = 3; n) {case 1: std::cout << "n is 1"; break;case 3: std::cout << "n is 3"; break;default: std::cout << "Unknown"; break;
}// std::cout << n; // ? 錯誤:n 作用域僅限于 switch 語句

特點

  • n 僅在 switch 語句內有效。
  • 避免全局變量的作用域污染

4. while 語句不支持變量初始化

不同于 ifswitchwhile 不支持 while (int x = 5; x > 0) 這樣的寫法:

// ? 錯誤:C++ 不允許 while 語句中初始化變量
while (int x = 10; x > 0) { std::cout << x << std::endl;x--; // 變量 x 在每次循環都會被重新初始化為 10
}

正確的做法

int x = 10;
while (x > 0) {std::cout << x << std::endl;x--;
}

5. for 語句的尾端變量初始化(C++17)

C++17 允許在 for 語句的條件部分和更新部分聲明變量:

for (int i = 0; bool condition = (i < 5); int j = i * 2, i++) {  std::cout << "i = " << i << ", j = " << j << std::endl;
}

特點

  • bool condition = (i < 5); 在循環條件部分初始化變量
  • int j = i * 2, i++ 在更新部分初始化變量
  • 變量 conditionj 作用域僅限于 for

6. C++17 變量初始化的優勢

傳統寫法C++17 寫法
變量在 if 語句外部定義,可能影響其他代碼變量的作用域被限制,僅限 if 語句內
可能無意間修改變量,導致難以調試的錯誤避免變量作用域污染,提高可讀性
switch 語句必須在外部定義變量switch 語句可以直接在表達式部分定義變量
for 只能在初始化部分聲明變量for 語句的 條件部分和更新部分 也能聲明變量

7. 總結

? 適用的語法(C++17 及以上)

if (初始化變量; 條件) { ... }
switch (初始化變量; 變量) { ... }
for (初始化變量; 條件; 更新部分) { ... }

不能用于 whiledo-while

? C++17 變量作用域優化的好處

  1. 避免作用域污染:變量僅在 if / switch / for 內部有效。
  2. 提升可讀性:減少不必要的外部變量聲明,使代碼更緊湊。
  3. 減少不必要的變量聲明,提高代碼簡潔度。

這項特性在 C++17 之后 非常實用,讓代碼更現代化,減少潛在的變量作用域污染!🚀

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

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

相關文章

【云原生之kubernetes實戰】在k8s環境中高效部署Vikunja任務管理工具(含數據庫配置)

【【云原生之kubernetes實戰】在k8s環境中高效部署Vikunja任務管理工具(含數據庫配置) 前言一、Vikunja介紹1.1 Vikunja簡介1.2 Vikunja主要特點1.3 使用場景二、相關知識介紹2.1 本次實踐存儲介紹2.2 k8s存儲介紹三、本次實踐介紹3.1 本次實踐簡介3.2 本次環境規劃3.3 部署前…

分享一個常用的命名規則和Spring的命名風格

目錄 Spring 命名風格規范總結表 常用代碼命名單詞&#xff08;通用且專業&#xff09; 命名技巧 一、返回布爾值的方法 二、條件執行方法 三、異步處理方法 四、回調方法 五、集合操作方法 六、狀態校驗方法 七、對象生命周期方法 八、數據操作方法 Spring 命名風格規…

【Golang學習之旅】Go-zero + Gen:如何使用 Gen 提升 Go 開發效率

文章目錄 前言一、Go-zero簡介二、Gen工具簡介2.1 Gen的功能與特點2.2 Gen的工作原理 三、Go-zero Gen&#xff1a;結合的優勢3.1為什么選擇Go-zero與Gen3.2 Gen的代碼生成與Go-zero的結合點 四、實際案例&#xff1a;Go-zero Gen的應用4.1 構建一個用戶管理系統4.2 定義Gen配…

軟件工程----統一過程模型RUP

統一過程RUP是一種以用例驅動、以體系結構為核心、迭代和增量的軟件開發過程&#xff0c;由UML方法和工具支持&#xff0c;廣泛應用于各類面向對象項目。 RUP本身支持可裁剪性&#xff0c;可應付給類領域軟件和不同的項目規模 RUP蘊含了大量優秀的實踐方法&#xff0c;如&…

48V電氣架構全面科普和解析:下一代智能電動汽車核心驅動

48V電氣架構&#xff1a;下一代智能電動汽車核心驅動 隨著全球汽車產業邁入電動化、智能化的新時代&#xff0c;傳統12V電氣系統逐漸暴露出其無法滿足現代高功率需求的不足。在此背景下&#xff0c;48V電氣架構應運而生&#xff0c;成為現代電動汽車&#xff08;EV&#xff09…

圖數據庫 | 24、如何進行正確性驗證?

圖數據庫計算和查詢結果的正確性&#xff0c;這個重要性當然是不言而喻的&#xff01; 老夫之前也寫文章講過&#xff0c;今天再手書一篇&#xff0c;旨在向大家系統地介紹一下圖數據庫查詢與計算到底如何進行正確性驗證&#xff01;&#xff01;&#xff01; 圖數據庫中的操…

Rust ~ Vec<u8>和[u8]

Vec<u8> 和 &[u8] 是兩種不同的數據類型&#xff0c;它們都與字節序列相關&#xff0c;但在所有權、內存管理、使用場景等方面存在明顯區別 類型本質 Vec<u8>&#xff1a;Rust 中的動態數組類型&#xff0c;即向量&#xff08;vector&#xff09;。它是一個擁…

MYSQL學習筆記(十):約束介紹(如:非空、唯一、主鍵、外鍵、級聯、默認、檢查約束)

前言&#xff1a; 學習和使用數據庫可以說是程序員必須具備能力&#xff0c;這里將更新關于MYSQL的使用講解&#xff0c;大概應該會更新30篇&#xff0c;涵蓋入門、進階、高級(一些原理分析);這一篇講解“約束”&#xff0c;如&#xff1a;非空、唯一、主鍵、外鍵、級聯、默認…

樹莓百度百科更新!宜賓園區業務再添新篇

樹莓集團宜賓園區業務不斷拓展&#xff0c;主要體現在以下幾個方面&#xff1a; 產業布局 -聚焦數字經濟核心領域&#xff1a;涵蓋軟件開發、人工智能、大數據等&#xff0c;吸引眾多上下游企業入駐&#xff0c;形成從芯片研發、軟件開發到系統集成的完整產業鏈條。 -推進“雙…

Halcon 學習之路 set_grayval 算子

gen_imag_const 創建灰度圖像 gen_image_const(Image&#xff0c;Type&#xff0c;Width&#xff0c;Height) 算子gen_image_const創建指定大小的圖像&#xff0c;圖像的寬度和高度由Width和Height決定 Type 像素類型 byte :每像素1字節&#xff0c;無符號&#xff08;0-255&…

03_pyqt5 + vlc 實現視頻播放器

1.功能需求如圖 按鈕: 播放/暫停, 前進/后退, 視頻上一個/下一個, 打開視頻進度條: 視頻進度條顯示, 進度條拖拽, 音量控制按鍵控制: 1,2,3,4縮放畫面大小, 2.方案選擇 開發語言: python UI界面: pyqt5 qt_designed 設計ui布局 視頻編碼: python-vlc 方案說明: 視頻解碼可…

使用vscode導出Markdown的PDF無法顯示數學公式的問題

我的硬件環境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF來導出md文件對應的PDF。但不管導出html還是PDF文件&#xff0c;數學公式都是顯示的源代碼。 我看了許多教程&#xff0c;給的是這個方法&#xff1a;在md文件對應的html文件中加上以下代碼&#xff1a…

Java 網絡編程(二)—— TCP流套接字編程

TCP 和 UDP 的區別 在傳輸層&#xff0c;TCP 協議是有連接的&#xff0c;可靠傳輸&#xff0c;面向字節流&#xff0c;全雙工 而UDP 協議是無連接的&#xff0c;不可靠傳輸&#xff0c;面向數據報&#xff0c;全雙工 有連接和無連接的區別是在進行網絡通信的時候&#xff0c;…

MySQL 事務筆記

MySQL 事務筆記 目錄 事務簡介事務操作事務四大特性并發事務問題事務隔離級別總結 事務簡介 事務&#xff08;Transaction&#xff09;是數據庫操作的邏輯單元&#xff0c;由一組不可分割的SQL操作組成。主要用于保證&#xff1a; 多個操作的原子性&#xff08;要么全部成功…

GPT1 與 GPT2 的異同

1.什么是GPT1&#xff1a; GPT1介紹了一種通過生成式預訓練&#xff08;Generative Pre-Training&#xff09;來提升語言理解能力的方法。這種方法首先在一個大型的未標注文本語料庫上進行語言模型的預訓練&#xff0c;然后針對具體的任務進行判別式微調&#xff08;discrimin…

Android Audio其他——數字音頻接口(附)

數字音頻接口 DAI,即 Digital Audio Interfaces,顧名思義,DAI 表示在板級或板間傳輸數字音頻信號的方式。相比于模擬接口,數字音頻接口抗干擾能力更強,硬件設計簡單,DAI 在音頻電路設計中得到越來越廣泛的應用。 一、音頻鏈路 1、模擬音頻信號 可以看到在傳統的…

kafka-leader -1問題解決

一. 問題&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分區的領導者副本尚未被選舉出來&#xff0c;或者在獲取領導者信息時出現了問題。以下是可能導致出現 kafka leader -1 的一些常見原因及相關分析&#xff1a; 1. 副本同步問題&#xff1a; 在 Kafka 集群中&…

DeepSeek基礎之機器學習

文章目錄 一、核心概念總結&#xff08;一&#xff09;機器學習基本定義&#xff08;二&#xff09;基本術語&#xff08;三&#xff09;假設空間&#xff08;四&#xff09;歸納偏好&#xff08;五&#xff09;“沒有免費的午餐”定理&#xff08;NFL 定理&#xff09; 二、重…

【jira】用到幾張表

jira用到的幾張表 測試計劃&#xff0c;測試周期&#xff0c;測試用例&#xff0c;問題記錄 1. 測試計劃 # 記錄表&#xff0c;查計劃詳情 SELECT ID,issuenum,SUMMARY FROM jiraissue where issuenum 22871# 測試計劃下&#xff0c;測試周期&#xff0c;查測試周期id&…

Mysql 死鎖場景及解決方案

一、常見死鎖場景 1. 不同順序的鎖獲取 場景&#xff1a;事務A按順序更新 行1 → 行2&#xff0c;事務B按 行2 → 行1 順序更新。 原因&#xff1a;雙方各持有一把鎖&#xff0c;同時請求對方持有的鎖&#xff0c;形成循環等待。 2. 索引缺失導致鎖升級 場景&#xff1a;更…