一、常量
printf("%d\n", 1234);
printf("%d\n", 123456789l);
printf("%d\n", 123456789L);
- 如果一个整数太大,以至于无法用int类型表示时,也将被当作long类型处理(存疑)
- 无符号常量以字母u或U结尾,后缀ul或UL表明是unsigned long类型
printf("%u\t%u\t%u\t%u\n", 4294967295u, 4294967295U, 4294967295ul, 4294967295UL);
- 浮点数常量中包含一个小数点(123.5)或一个指数(1e-2),或两者都有
printf("%f\t%f\n", 1.235, 123.5e-2);
- 没有后缀的浮点数常量为double类型。后缀f或F表示float类型,而后缀l或L则表示long double类型
printf("%f\n", 1.24);
printf("%f\n", 1.24f);
printf("%f\n", 1.24F);
printf("%f\n", 1.24l);
printf("%f\n", 1.24L);
- 整型数除了用十进制表示外,还可以用八进制或十六进制表示。带前缀0的整型常量表示它为八进制形式,前缀为0x或0X表示它为十六进制形式。例如:十进制数31可以写成八进制形式037,也可以写成十六进制形式0x1f或0X1F。八进制与十六进制的常量也可以使用后缀L表示long类型,使用后缀U表示unsigned类型。例如:0XFUL是一个unsigned long类型的常量,其值等于十进制数15
printf("%d\n", 31);
printf("%d\n", 037);
printf("%d\n", 0x1f);
printf("%d\n", 0X1F);
printf("%d\n", 0XFUL);
printf("%d\n", 017UL);
printf("%o\n", 037);
printf("%x\n", 0X1F);
- 一个字符常量就是一个整数,写的时候将一个字符括在单引号中,如’x’。字符在机器字符集中的数值就是字符常量的值。例如,在ASCII字符集中,字符’0’的值为48,它与数值0没有关系。字符常量一般用来与其他字符比较,但也可以像其他整数一样参与数值运算。
printf("%d\n", '0');
printf("%d\n", 'A');
printf("%d\n", 'a');
printf("%d\n", '0' < 'A');
printf("%d\n", '0' > 'A');
printf("%d\n", '0' - 'A');
- 还有一种字符常量比较特殊,那就是转义字符,比如’\n’,转义字符看起来像是两个字符,但只表示一个字符。另外,我们可以用’\ooo’,‘\xhh’ 这种表示任意字节大小的位模式,其中ooo代表1~3个八进制数字(0…7),hh代表一个或多个十六进制数字(0…9,a…f,A…F)
printf("a%db\n", '\013');
printf("a%db\n", '\007');
printf("a%db\n", '\xb');
printf("a%db\n", '\x7');
转义字符 | 含义 | 转义字符 | 含义 |
---|
\a | 响铃符 | \\ | 反斜杠 |
\b | 回退符 | \? | 问号 |
\f | 换页符 | \’ | 单引号 |
\n | 换行符 | \" | 双引号 |
\r | 回车符 | \ooo | 八进制数 |
\t | 横向制表符 | \xhh | 十六进制数 |
\v | 纵向制表符 | | |
- 字符常量’\0’表示值为0的字符,也就是空字符(null)。我们通常用’\0’的形式代替0,以强调某些表达式的字符属性,但其数字值为0。
printf("a%db\n", '\0');
#define MAXLINE 1000
char line[MAXLINE + 1];
- 字符串常量,也叫字符串字面值,是用双引号括起来的0个或多个字符组成的字符序列。比如:
“I am a string” 或 “” (空字符串) 都是字符串。双引号不是字符串的一部分,它只用于限定字符串。编译时,可以将多个字符串常量连起来。
printf("%s\n", "a\"b\'");
printf("%s\n", "hello, world");
printf("%s\n", "hello," " world");
- 字符串常量的本质是一个字符数组,使用’\0’表示字符串的结尾,因此存储字符串的物理存储单元数比括在双引号中的字符数多一个。标准库函数strlen(s)可以返回字符串参数s的长度,但长度不包含’\0’。当然,我们可以设计一个strlen(s)函数
printf("%d", strlen("hello"));
int strlen(char s[]) {
int l;
l = 0;
while (s[l] != '\0')
l++;
return l;
}
标准头文件<string.h>中声明了strlen和其他字符串函数
#include <string.h>
printf("%d", strlen("hello"));
- 我们应该搞清楚字符常量和仅包含一个字符的字符串常量的区别:‘x’和"x"是不同的,前者是一个整数,其值是字母x在机器字符集中的对应的数值;后者是一个包含一个字符(x)和一个结束符’\0’的字符数组。
- 枚举常量,是另外一种类型的常量,是一个常量整型值的列表,比如:
enum boolean {NO, YES};
enum months {JAN=1, FEB, MAR};
- 在没有显式说明的情况下,enum类型中第一个枚举的值为0,第二个为1,依次类推;比如,NO的值为0,YES的值为1
- 如果只指定了部分枚举的值,那么未指定值的枚举的值将依着最后一个指定值向后递增。比如,FEB的值为2,MAR的值为3
- 不同枚举中的名字必须互不相同
- 同一枚举中的不同名字可以有相同的值
#include <stdio.h>
enum boolean { NO, YES };
enum months { JAN = 1, FEB, MAR };
main()
{
printf("NO: %d\n", NO);
printf("YES: %d\n", YES);
printf("JAN: %d\n", JAN);
printf("FEB: %d\n", FEB);
printf("MAR: %d\n", MAR);
return 0;
}