C++中雙引號和單引號的區別(全面分析)

我在刷算法題的時候經常遇到,用了' '出現警告或者使用" "直接報錯,尤其是在字符串部分(py玩家后遺癥/(ㄒoㄒ)/~~)在詳細了解后總結一下加強記憶。

總的來說在 C++ 中,雙引號?""?和單引號?''?是完全不同的語法元素,數據類型、存儲方式有所差異。

對比維度單引號?''(字符常量)雙引號?""(字符串常量)
數據類型charconst char[](字符數組)
存儲內容單個字符的 ASCII 碼字符序列 + 末尾?'\0'?結束符
占用字節固定 1 字節字符數 + 1 字節(含?'\0'
內容限制僅 1 個字符(非空)0 個或多個字符(可空)
賦值對象char?變量const char*?/?char[]
隱式轉換可轉?int(ASCII 碼)可轉?const char*(首地址)
示例'5''\t''Z'"""abc""x\ny"

一、核心定義與數據類型

這是最根本的區別:單引號表示字符常量(char?類型),雙引號表示字符串常量(const char[]?類型,本質是字符數組)

符號表示內容數據類型本質含義
'a'單個字符常量char單個 ASCII 字符
"a"字符串常量const char[]以?'\0'?結尾的字符數組

二、存儲方式與字節長度

兩者在內存中的存儲形式和占用字節數完全不同,這是導致后續所有區別的根源。

1. 單引號(字符常量)
  • 存儲:直接存儲單個字符的?ASCII 碼值,占用?1 個字節char?類型的標準大小)。
  • 示例:
    'A'?在內存中存儲為 ASCII 碼?65(二進制?01000001),僅占 1 字節。
  • 長度計算:sizeof('A') == 1(固定為 1,與字符無關)。
2. 雙引號(字符串常量)
  • 存儲:本質是?字符數組,除了顯式的字符外,末尾會自動添加一個?'\0'?空字符(作為字符串結束標志),總占用字節數 = 顯式字符數 + 1。
  • 示例:
    "A"?在內存中實際是?{'A', '\0'},占用 2 字節;
    "hello"?是?{'h','e','l','l','o','\0'},占用 6 字節。
  • 長度計算:
    • sizeof("A") == 2(包含?'\0'?的總字節數);
    • strlen("A") == 1strlen?統計?'\0'?之前的字符數,需包含?<cstring>?頭文件)。

三、語法規則:內容限制不同

C++ 對兩者的語法有嚴格限制,違反會導致編譯錯誤。

1. 單引號?''?的限制
  • 只能包含 1 個字符:不能為空(''?編譯錯誤),也不能包含多個字符('ab'?是「多字符常量」,語法不推薦,值為各字符 ASCII 碼的組合,結果不確定)。
  • 合法示例:'5''+''\n'(轉義字符,本質是單個字符,ASCII 碼為 10)。
  • 非法示例:''(空字符常量,錯誤)、'12'(多字符,不推薦)。
2. 雙引號?""?的限制
  • 可包含 0 個或多個字符:空字符串?""?合法(僅存儲?'\0',占 1 字節),多字符也合法(如?"123abc")。
  • 支持轉義字符:如?"a\nb"?表示?'a'、換行符?'\n''b''\0',共 4 字節。
  • 合法示例:""(空字符串)、"Hello, C++""x\ty"(包含制表符)。
  • 非法示例:無本質非法內容,但需注意轉義字符的正確性(如?"a\b"?合法,"a\z"?非法,因為?\z?不是有效轉義符)。

下面代碼最能體現區別

  string s3 =s1+s2;//bwabwacout << s3<<endl;//-------------插入push_back()和insert()  push_back為void類型,刪除erase()s1.push_back('c');string s4 = s1;  //bwacs4.insert(s4.begin(),'i');//ibwacs1.erase(s1.begin()+3); //bwa  s1.erase(s.begin() + 1, s.begin() + 3); 刪除范圍//--------------replace() repalce()函數:s.replace(pos,len,ss),將s從pos開始的len個字符替換成ss,s3.replace(2,2,"aa");  //bwabwa->bwaawacout<<s3<<endl;//s.replace(pos,n1,n2,c),將s從pos開始的n1個字符替換成n2個字符c。s3.replace(2,2,1,'z'); //bwaawa-> bwzwa

四、如何選擇區分

兩者的使用場景嚴格依賴于變量 / 函數參數的類型,混用會導致編譯錯誤。

1. 單引號?''?的使用場景
  • 給?char?類型變量賦值:
    char c1 = 'a';    // 正確:char 變量匹配字符常量
    char c2 = 65;     // 正確:等價于 'A'(ASCII 碼)
    char c3 = "a";    // 錯誤:字符串常量(const char[])無法賦值給 char 變量
    
  • 作為?char?類型參數傳遞給函數:
    putchar('B');     // 正確:putchar 接收 char 類型
    cout << 'c';      // 正確:輸出 ASCII 碼對應的字符(顯示 'c')
    
2. 雙引號?""?的使用場景
  • 給字符串相關類型賦值(字符指針、字符數組):
    const char* s1 = "hello";  // 正確:字符串常量賦值給字符指針(指向常量區)
    char s2[] = "world";       // 正確:字符串常量初始化字符數組(會復制到棧區)
    char s3[6] = "hello";      // 正確:數組大小 = 字符數 + 1(包含 '\0')
    char s4[5] = "hello";      // 錯誤:數組大小不足(需 6 字節,實際僅存 5 個字符,無 '\0')
    
  • 作為字符串參數傳遞給函數:

    cpp

    puts("Hi!");              // 正確:puts 接收字符串常量
    strlen("test");           // 正確:計算字符串長度(結果為 4)
    cout << "C++";            // 正確:輸出字符串(自動識別 '\0' 結束)
    

五、隱式轉換與兼容性

1. 字符常量('c')的隱式轉換
  • 可隱式轉換為?int?類型(值為對應的 ASCII 碼):
    int num = '0';  // 正確:num = 48('0' 的 ASCII 碼)
    cout << 'z';    // 輸出 122('z' 的 ASCII 碼)
    
2. 字符串常量("c")的隱式轉換
  • 可隱式轉換為?const char*?類型(指向字符串的首地址),但不能轉換為?int?或?char
    const char* p = "abc";  // 正確:p 指向 'a' 的地址
    int len = "abc";        // 錯誤:字符串無法直接轉換為 int
    
  • 字符串常量是只讀的:賦值給非?const?指針會導致未定義行為(C++11 后編譯器會警告):
    char* p = "hello";      // 不推薦:"hello" 是 const,修改 p[0] 會崩潰
    const char* p = "hello";// 正確:明確只讀,避免誤修改
    

六、特殊情況:空值與轉義字符

1. 空值處理
  • 字符常量無 “空值”:''?非法,若需表示空字符,需用轉義字符?'\0'(ASCII 碼 0):
    char null_char = '\0';  // 正確:表示空字符(占 1 字節)
    
  • 字符串常量可有空值:""?是合法的空字符串,僅包含?'\0'(占 1 字節):
    const char* empty_str = "";
    cout << strlen(empty_str);  // 輸出 0(無有效字符)
    cout << sizeof(empty_str);  // 輸出 8(指針大小,64 位系統)
    cout << sizeof("");         // 輸出 1(僅 '\0')
    

2. 轉義字符的使用
  • 單引號中:轉義字符需用?\,如?'\''?表示字符?''\n'?表示換行符。
  • 雙引號中:轉義字符同樣需用?\,如?"\""?表示字符串?""a\\b"?表示字符串?a\b

常見錯誤示例與原因

  1. 錯誤 1:字符串賦值給?char?變量
    char c = "a";  // 錯誤:類型不匹配(const char[] → char)
    
  2. 錯誤 2:單引號包含多個字符
    char c = 'ab'; // 不推薦:多字符常量,值為 0x6162(依賴編譯器,結果不確定)
    

  3. 錯誤 3:字符串數組未留?'\0'?空間
    char arr[3] = "abc"; // 錯誤:"abc" 需 4 字節(含 '\0'),數組僅 3 字節,截斷導致無結束符
    

  4. 錯誤 4:修改字符串常量
    char* s = "hello"; s[0] = 'H'; // 未定義行為:"hello" 是只讀常量,修改會崩潰

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

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

相關文章

Ubuntu20.04仿真 |iris四旋翼添加云臺相機詳述

申明&#xff1a; 1、本人使用的是Ubuntu20.04ros1gazeboxtdronepx4的仿真組合 2、為了使傳感器模型和飛機模型解耦合&#xff0c;實現不同平臺對傳感器可直接調用&#xff0c;本系列博文涉及的所有傳感器均不直接添加在相應平臺的sdf當中&#xff0c;而是通過編寫xxx_joint.…

《人工智能AI之機器學習基石》系列 第 16 篇:關聯規則與數據挖掘——“啤酒與尿布”傳奇背后的增長秘密

《人工智能AI之機器學習基石》? 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察+ 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。 引言:藏在購物車里的“讀心術” 朋友們,歡迎回到我們的AI基石之旅。 在過去的兩次探索中,我們深入…

Spring Boot 的自動配置原理

Spring Boot 的自動配置是其 "約定大于配置" 理念的核心實現&#xff0c;它能自動配置 Spring 應用所需的各種組件&#xff0c;大幅減少手動配置。下面從核心注解、加載流程、條件過濾等方面詳細講解其原理&#xff0c;并結合關鍵源碼說明。一、自動配置的入口&#…

谷歌云平臺(Google Cloud Platform, GCP)介紹(全球領先的云計算服務平臺,為企業和開發者提供包括計算、存儲、數據分析、人工智能、機器學習、網絡和安全等在內的全面云服務)

文章目錄**1. GCP的核心優勢****1.1 全球領先的基礎設施****1.2 強大的數據分析和人工智能能力****1.3 卓越的安全性和合規性****1.4 靈活的定價模式****2. GCP的主要服務****2.1 計算服務****2.2 存儲和數據庫****2.3 網絡服務****2.4 人工智能與大數據****2.5 安全與管理工具…

RISC-V異常機制和異常定位

不少人在調試RISC-V core時&#xff0c;面對異常的出現不知所措&#xff0c;不知道如何定位代碼問題。這里將從RISC-V異常機制以及幾個異常實例學習下。 1 異常機制 1.1 什么是異常 異常是軟件程序員不得不要深入了解的&#xff0c;首先在學習異常機制前&#xff0c;對異常要…

c++中導出函數調用約定為__stdcall類型函數并指定導出函數名稱

開發環境在Visual studio 2022版本下&#xff0c;為防止編譯器重命名函數名稱&#xff08;會加上8等等亂七八糟的東西&#xff09;&#xff0c;我們對函數名稱進行指定&#xff1a;一、新建.def文件&#xff0c;名稱須與dll名稱相同&#xff0c;并放在與cpp文件相同文件夾下&am…

Vision Transformer (ViT) :Transformer在computer vision領域的應用(二)

METHOD,論文主要部分 In model design we follow the original Transformer (Vaswani et al., 2017) as closely as possible. An advantage of this intentionally simple setup is that scalable NLP Transformer architectures – and their efficient implementations –…

AI 論文周報丨紅隊測試語言模型/多視角 3D 點追蹤方法/蛋白質表示學習框架/密碼學漏洞檢測新框架……

近年來&#xff0c;已有若干方法嘗試從單目視頻實現 3D 點跟蹤&#xff0c;然而由于在遮擋和復雜運動等挑戰性場景中難以準確估計 3D 信息&#xff0c;這些方法的性能仍難以滿足實際應用對高精度與魯棒性的要求。 基于此&#xff0c;蘇黎世聯邦理工學院、卡內基梅隆大學聯合提出…

STM32 通過USB的Mass Storage Class讀寫掛載的SD卡出現卡死問題

問題描述&#xff1a;使用stm32cubemx生成的sdio和usb Mass Storage Class的代碼后&#xff0c;在USB_DEVICE\App\usbd_storage_if.c文件里面的接口調用以下函數出現卡死問題&#xff1a; SD_Driver.disk_initialize(0); SD_Driver.disk_read(lun, buf, blk_addr, blk_len) SD_…

Go語言中 error 接口與自定義錯誤類型的深入解析

在 Go 語言開發中&#xff0c;我們經常需要處理各種錯誤情況。Go 語言通過 error 接口提供了一套簡潔而強大的錯誤處理機制。然而&#xff0c;當涉及到自定義錯誤類型時&#xff0c;許多開發者會遇到一些令人困惑的問題。本文將通過一個實際案例來深入探討這個問題。 問題背景 …

字幕編輯工具推薦,Subtitle Edit v4.0.13發布:增強語音識別+優化翻譯功能

大家好呀&#xff0c;不知道大家有沒有做自媒體相關工作的呢&#xff0c;你們是不是也覺得剪輯視頻時最頭疼的往往不是畫面而是字幕&#xff0c;時間軸對不上、格式不兼容、需要手動翻譯&#xff0c;這些瑣碎工作消耗的精力甚至超過剪輯本身。 當你試遍各種在線工具卻發現要么…

【Java后端】Spring Boot 集成雪花算法唯一 ID

Spring Boot 實現基于雪花算法的分布式唯一 ID 生成器在分布式系統中&#xff0c;我們經常需要生成 全局唯一 ID&#xff0c;比如用戶 ID、訂單號、消息 ID 等。常見的方式有&#xff1a;數據庫自增主鍵、UUID、Redis/Zookeeper 分布式 ID 服務、百度 UidGenerator、美團 Leaf …

C語言初嘗試——洛谷

一、C數組&#xff1a;C 語言支持數組數據結構&#xff0c;它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列數據&#xff0c;但它往往被認為是一系列相同類型的變量。聲明數組在 C 中要聲明一個數組&#xff0c;需要指定元素的類型和元素的數量&#xf…

C++八大排序

C排序算法一、概覽二、代碼實現1.冒泡排序2.插入排序3.希爾排序4.堆排序5.選擇排序6.快速排序7.歸并排序三、排序時間、空間復雜度總結排序&#xff0c;是C各大算法當中非常常見的一個步驟&#xff08;過程&#xff09;&#xff0c;通常我們使用便捷的algorithmalgorithmalgori…

每天五分鐘深度學習:深層神經網絡的優勢

本文重點 在人工智能領域,深層神經網絡(DNN)的崛起標志著技術范式的根本性轉變。相較于傳統淺層神經網絡(如單層感知機、線性回歸模型),深層網絡通過引入多層隱藏層,實現了對復雜數據模式的深度解析與高效建模。 深層神經網絡 神經網絡中輸入層表示神經網絡的第0層,…

相機幾何 空間點到像素平面轉換

一個空間中點到像素平面轉換&#xff0c;需要經過1. 空間坐標系轉換到相機坐標系2. 相機坐標系下3D點到相機平面轉換3. 相機平面到像素平面轉換相機三維空間到像素平面轉換1. 3D點到相機平面轉換2. 相機平面到像素平面轉換涉及到單位的轉換&#xff0c;和像素原點到相機平面原點…

webpack5 vue3同一倉庫,不同命令切換項目

技術方案&#xff1a;手動輸入不同的命令&#xff0c;啟動不同項目。實現這種能力本篇文章是通過不同路由劃分&#xff0c;進而實現不同項目的劃分。所以簡單來說就是通過輸入不同命令行在webpack中找到不同項目的路由&#xff0c;進而打不同項目的包&#xff0c;實現項目隔離。…

PowerBI實戰-制作帶有同比及趨勢線的雙柱狀圖

一、引言 今天的PowerBI報表的制作相對有一點復雜&#xff0c;我們直接根據最終展示圖來講解&#xff1a; 可以看到&#xff0c;我們今天要制作的圖像需要包括以下幾點&#xff1a;時間維度的趨勢、兩種不同維度的數據對比、不同數據標簽的展示、不同年份間環比的標簽展示以及…

物聯網智能網關配置教程:實現注塑機數據經基恩士PLC上傳至云平臺

一、項目背景隨著制造業向智能化、信息化方向快速發展&#xff0c;注塑車間作為塑料制品制造的核心環節&#xff0c;面臨著設備協議多樣、數據孤島嚴重、系統集成困難等問題。某大型注塑企業計劃對其老舊車間進行數字化改造&#xff0c;實現設備數據采集、遠程監控與MES系統對接…

【實戰】預警算法--噪聲添加機制

1. 背景 在多變量自聯想預測或異常檢測場景中&#xff0c;我們常使用帶噪自編碼器&#xff08;Denoising AutoEncoder&#xff0c;DAE&#xff09;來訓練模型&#xff0c;使模型能夠從帶噪輸入中重構原始數據。噪聲的添加方式對訓練效果、穩定性以及模型用途有顯著影響。 2. 兩…