C和C++中,单引号和双引号虽然看起来相似,但它们代表的含义却完全不同,主要用于区分字符和字符串。单引号 和双引号 用于表示不同类型的数据,它们在语法和用途上有显著的区别。

1、单引号 (')

用于表示单个字符常量。单引号内只能有一个字符,表示该字符的ASCII值或者Unicode值。在C和C++中,字符常量的类型是 char,通常占用1个字节。

1)基本字符常量

#include <stdio.h>

int main() {
    char c = 'A';  // 将字符 'A' 赋值给变量 c
    printf("字符: %c\n", c);  // 输出:字符: A
    printf("字符的ASCII值: %d\n", c);  // 输出:字符的ASCII值: 65
    return 0;
}

2)字符常量的类型是 char

#include <stdio.h>

int main() {
    char c1 = 'a';  // 'a' 的ASCII值是97
    char c2 = '1';  // '1' 的ASCII值是49
    char c3 = '+';  // '+' 的ASCII值是43
    
    printf("字符 c1: %c, ASCII值: %d\n", c1, c1);
    printf("字符 c2: %c, ASCII值: %d\n", c2, c2);
    printf("字符 c3: %c, ASCII值: %d\n", c3, c3);
    
    return 0;
}

3)字符常量与整型操作

#include <stdio.h>

int main() {
    char c = 'A';  // 'A' 对应的ASCII值是 65
    if (c == 65) {
        printf("字符 c 的值是 A\n");  // 输出:字符 c 的值是 A
    }
    return 0;
}

4)字符常量与转义字符

#include <stdio.h>

int main() {
    char newline = '\n';  // 使用转义字符表示换行
    char tab = '\t';      // 使用转义字符表示制表符
    
    printf("Hello%cWorld\n", newline);  // 输出:Hello(换行)World
    printf("Column1%cColumn2\n", tab);  // 输出:Column1(制表符)Column2
    
    return 0;
}

2、双引号 (")

用于表示字符串常量,即字符数组。双引号内的内容是一个以null字符 ('\0') 结尾的字符数组,表示字符串。在C和C++中,字符串常量的类型是 const char[],即一个字符数组。

1) 字符串赋值

#include <stdio.h>

int main() {
    // 定义一个字符串常量
    const char *str = "Hello, World!";
    
    // 打印字符串
    printf("%s\n", str);  // 输出: Hello, World!
    
    return 0;
}

2)字符串连接

C和C++中,字符串常量可以直接连接,编译器会将它们合并为一个字符串。

#include <stdio.h>

int main() {
    const char *str1 = "Hello, ";
    const char *str2 = "World!";
    
    // 使用printf打印两个字符串
    printf("%s%s\n", str1, str2);  // 输出: Hello, World!
    
    return 0;
}

3)字符串常量和字符数组

C和C++中,字符串常量其实是以 const char[] 形式存储的,可以通过字符数组来操作它们。

#include <stdio.h>

int main() {
    // 字符数组存储字符串常量
    char str[] = "Hello, World!";
    
    // 修改字符数组中的内容
    str[7] = 'w';
    
    printf("%s\n", str);  // 输出: Hello, world!
    
    return 0;
}

4)字符串与字符数组的区别

#include <stdio.h>

int main() {
    const char *str1 = "Hello, World!";  // 字符串常量
    char str2[] = "Hello, World!";       // 字符数组

    printf("str1: %s\n", str1);  // 输出: Hello, World!
    printf("str2: %s\n", str2);  // 输出: Hello, World!

    // 修改字符数组中的字符
    str2[7] = 'w';

    printf("Modified str2: %s\n", str2);  // 输出: Hello, world!
    
    return 0;
}

5)字符串常量与std::string(C++特有)

C++中,std::string 是一种更为常用的字符串类型,它在内存中以字符串常量的方式初始化,但提供了更多操作字符串的功能。

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, C++!";
    
    // 使用std::string进行字符串操作
    str += " How are you?";
    
    std::cout << str << std::endl;  // 输出: Hello, C++! How are you?
    
    return 0;
}

6)字符串和字符数组的内存分配

#include <stdio.h>

int main() {
    const char *str1 = "Hello";  // 字符串常量,存储在只读数据区
    char str2[] = "Hello";       // 字符数组,存储在栈上
    
    // 打印两者的地址
    printf("Address of str1: %p\n", (void*)str1);  // 输出: Address of str1: (只读区地址)
    printf("Address of str2: %p\n", (void*)str2);  // 输出: Address of str2: (栈区地址)
    
    return 0;
}

3、区别

特性单引号 (')双引号 (")
用途字符常量(单一字符)字符串常量(字符数组)
类型charchar[](或 const char[]
长度只能包含一个字符可以包含零个或多个字符(加上空字符 \0
示例'A''1''\n'"Hello""World"
空字符终止符不适用自动添加空字符终止符 (\0)

示例代码,

#include <stdio.h>

int main() {
    // 使用单引号:字符常量
    // 'A' 是字符常量,表示字符 'A',其类型为 char
    char charVar = 'A'; 

    // 使用双引号:字符串常量
    // "A" 是字符串常量,表示字符数组 "A\0",其类型为 const char[]
    const char* strVar = "A"; 

    // 打印字符和字符串
    // 输出:字符变量 charVar: A
    printf("字符变量 charVar: %c\n", charVar);  
    // 输出:字符串变量 strVar: A
    printf("字符串变量 strVar: %s\n", strVar); 

    // 比较字符与字符串的第一个字符
    if (charVar == strVar[0]) {
        // 输出:字符和字符串的第一个字符相同。
        printf("字符和字符串的第一个字符相同。\n");  
    }

    // 字符常量与字符串常量的区别
    // 输出:字符常量 'A' 的 ASCII 值: 65
    printf("字符常量 'A' 的 ASCII 值: %d\n", charVar);  
    // 输出:字符串常量 "A" 的长度: 1
    printf("字符串常量 \"A\" 的长度: %zu\n", strlen(strVar));  

    return 0;
}

推荐文档