You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中多字符字面量赋值给char的行为及原理问询

C语言多字符字面量与转义符解析

示例代码

#include <stdio.h>

int main(void) {
    // your code goes here
    char a = '\010';
    int b = 010;
    char c = '310';
    char d = '\310';
    int e = 0310;
    int f = 0x10;
    char g = '\0x10';
    char h = 'A';
    char i = 'hello';
    char j = '\hello';
    char k = '\0hello';
    printf("a=%d b=%d c=%d d=%d e=%d f=%d g=%d h=%d i=%d j=%d k=%d", a, b,c, d, e, f, g, h, i, j, k);
    return 0;
}

程序输出

a=8 b=8 c=48 d=-56 e=200 f=16 g=48 h=65 i=111 j=111 k=111

逐个变量值解析

  • a = '\010':\0开头是八进制转义序列,010是八进制数,转换为十进制是8,因此a的值为8。
  • b = 010:整数字面量前加0表示八进制数,010转十进制为8,所以b=8。
  • c = '310':这是多字符字面量,当前编译器采用取最后一个字符的规则,最后一个字符是'0',其ASCII值为48,故c=48。
  • d = '\310':\后跟3位八进制数310,转十进制是200。由于默认char是有符号类型,200超过有符号char的最大值127,以补码形式存储时对应-56,因此d=-56。
  • e = 0310:八进制整数310转十进制为3×64 + 1×8 + 0 = 200,所以e=200。
  • f = 0x10:0x开头是十六进制字面量,0x10转十进制为16,故f=16。
  • g = '\0x10':\0是八进制转义(值为0),后续的x10作为普通字符组成多字符序列,编译器取最后一个字符'0',其ASCII值为48,所以g=48。
  • h = 'A':单个字符字面量,'A'的ASCII值为65,因此h=65。
  • i = 'hello':多字符字面量,编译器取最后一个字符'o',其ASCII值为111,故i=111。
  • j = '\hello':\h不是合法转义序列,编译器忽略\,将其视为普通多字符序列'hello',取最后一个字符'o',值为111,所以j=111。
  • k = '\0hello':\0是八进制转义,后续的hello作为普通字符组成多字符序列,编译器取最后一个字符'o',值为111,因此k=111。

多字符字面量的工作机制

C语言中,用单引号包裹多个字符的多字符字面量,类型为int,具体取值由编译器实现定义,常见处理逻辑有两种:

  1. 直接取多字符序列的最后一个字符(如示例中编译器的行为);
  2. 将字符按字节顺序打包到int中(字节顺序取决于系统的大小端模式)。
    当赋值给char类型变量时,会截断int值,只保留对应字节的内容(同时受char是否为有符号类型影响)。

转义符\的意义

转义符\用于表示无法直接输入或具有特殊含义的字符,核心用法包括:

  • 八进制转义:\后跟1-3位八进制数字(0-7),对应ASCII值的字符,如\0表示空字符(值0);
  • 十六进制转义:\x后跟任意位数的十六进制数字,如\x41对应'A';
  • 特殊字符转义:用于表示换行\n、制表符\t、单引号\'、双引号\"、反斜杠\\等;
  • 若\后跟的不是合法转义序列(如\h),编译器会忽略\,将后续字符当作普通字符处理。

内容的提问来源于stack exchange,提问作者CodeTalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:40:32