字面常量 (C语言)

字面常量（literal constant），是C程序设计语言与C++语言的词法上的概念（lexical conventions），是指源程序中表示固定值的符号（token）。 
下述内容遵从C11与C++11语言标准。

字符串字面常量

C语言经典的ASCII-0字符串，例如"Hello world!"。
由R"<someChars>ₒₚₜ( 与 )<someChars>ₒₚₜ"括起来的字符串字面量叫做raw string literal，这可以避免大量使用反斜线转义字符造成的令人眼花缭乱的倾斜牙签综合征，特别适用于定义正则表达式的模式字符串时。例如：
 std::string filePath = R"(C:\Foo\Bar.txt)";
 std::regex re{ R"abc(s/"\([^"]*\)"/'\1'/g)abc" }; //如果字符串包含了)"这两个字符的组合，可选别的分界符，如abc。但这个分界符序列的长度最多16。

字符串字面量的值默认为工作字符集的编码。使用编码前缀（encoding-prefix）： u8 u U L 指出字符串字面量的值为UTF-8、char16_t、char32_t、wchar_t的编码序列。例如，
 char ss[]=u8"Hi世界";// ss数组内保存的是'H'、'i'、'世'、'界'这四个字符的UTF-8的编码值
相邻的两个字符串将被编译器自动连接为一个字符串。如：
 char ss[]="Hello" " world.";

枚举常量

枚举类型实质上是取有限个值的整型。根据C与C++98标准，枚举常量属于定义了枚举类型的那个作用域，而不属于这个枚举类型的内部作用域。C++发明人Bjarne Stroustrup称之为枚举常量的作用域不受限（unscoped）现象，这会造成命名冲突，与枚举常量是“有类型的常量”的初衷不符，与面向对象程序设计的原则严重相悖。例如：
enum FileAccess {
    Read = 0x1,
    Write = 0x2,
};
FileAccess access = ::Read; // 正确
FileAccess access = FileAccess::Read; // 错误
enum FileShare {
   Read = 0x1, // 重定义错误Write = 0x2, // 重定义错误};
C++11为解决上述问题，引入了“枚举类”（enum class）。在定义枚举类型时，enum关键字后面加上class关键字（或struct关键字）；引用枚举常量时，必须加上枚举类型名使其为作用域限定（scoped）。这避免了枚举常量的命名冲突；同时也避免了不同枚举类型的值的隐式类型转换，从而保证了枚举类型是强类型（strongly typed）的。例如：
enum class Color { RED, BLACK }; 
Color c = Color::RED;
C++11还允许指定枚举类型的存储类型，这使得枚举类型的前向声明（forward declaration）成为可能。例如：
enum class Color : char ; // forward declaration
void foo (Color *p);// ...
// ...
enum class Color : char { RED, BLUE }; // definition

布尔型字面常量

有两个bool类型的字面常量：true  false

指针型字面常量

C++11定义了一个字面常量nullptr，其类型是std::nullptr_t。但std::nullptr_t既不是指针类型也不是到成员的指针类型。

用户定义的字面量

C++11新增加了用户定义的字面常量（user defined literal）。由用户给出字面常量的后缀，并给出字面量运算符函数（或模板）的定义。编译器可在运行期或编译期把带有这样后缀的整型、浮点型、字符型、字符串型的字面量通过调用用户的字面量运算符函数（或模板），生成指定数据类型的对象。例如，
#include<iostream>struct S{
    int value;};S operator ""_mysuffix(unsigned long long v)  //用户定义字面量运算符的实现{
     S s_;
     s_.value=(int)v;
     return s_;}int main(){
   S sv;
   sv=101_mysuffix;  //这里的101是类型S的字面量
   std::cout<<sv.value<<std::endl;
   return 0;}