整数常量
 整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
 整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
212         /* 合法的 */
215u        /* 合法的 */
0xFeeL      /* 合法的 */
078         /* 非法的:8 不是八进制的数字 */
032UU       /* 非法的:不能重复后缀 */
85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* 整数 */
30u        /* 无符号整数 */
30l        /* 长整数 */
30ul       /* 无符号长整数 */
浮点常量
 当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。
 当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。
 带符号的指数是用 e 或 E 引入的。
3.14159       /* 合法的 */
314159E-5L    /* 合法的 */
510E          /* 非法的:不完整的指数 */
210f          /* 非法的:没有小数或指数 */
.e55          /* 非法的:缺少整数或分数 */
字符常量
 字符常量是括在单引号中,例如,‘x’ 可以存储在 char 类型的简单变量中。
 字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。
 在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义。
转义序列 含义
 \ \ 字符
 ’ ’ 字符
 " " 字符
 ? ? 字符
 \a 警报铃声
 \b 退格键
 \f 换页符
 \n 换行符
 \r 回车
 \t 水平制表符
 \v 垂直制表符
 \ooo 一到三位的八进制数
 \xhh . . . 一个或多个数字的十六进制数
#include <stdio.h>
 
int main()
{
   printf("Hello\tWorld\n\n");
 
   return 0;
}
结果:
Hello   World
定义常量
 使用 #define 预处理器。
#include <stdio.h>
 
#define LENGTH 10   
#define WIDTH  5
#define NEWLINE '\n'
 
int main()
{
 
   int area;  
  
   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);
 
   return 0;
}
结果:
value of area : 50
使用 const 关键字。
#include <stdio.h>
 
int main()
{
   const int  LENGTH = 10;
   const int  WIDTH  = 5;
   const char NEWLINE = '\n';
   int area;  
   
   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);
 
   return 0;
}
结果:
value of area : 50
define与const的区别:
 (1) 编译器处理方式不同
 #define 宏是在预处理阶段展开。
 const 常量是编译运行阶段使用。
(2) 类型和安全检查不同
 #define 宏没有类型,不做任何类型检查,仅仅是展开。
 const 常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
 #define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。)
 const常量会在内存中分配(可以是堆中也可以是栈中)。
(4) const 可以节省空间,避免不必要的内存分配。
(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
(6) 宏替换只作替换,不做计算,不做表达式求解;
补充:
 #define N 2+3, N 的值是 5。
double a;
a = (float)N/(float)2;
在编译时我们预想 a=2.5,实际打印结果是 3.5 原因是在预处理阶段,编译器将 a=N/2 处理成 a=2+3/2,这就是 define 宏的边缘效应,所以我们应该写成 #define N (2+3)。










