一站式学习C编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 常量

常量(Constant)是程序中最基本的元素,有字符(Character)常量、整数(Integer)常量、浮点数(Floating Point)常量和枚举常量。枚举常量将在第7.3节介绍。下面看一个例子:

      printf("character: %c\ninteger: %d\nfloating point: %f\n", '}', 34,
      3.14);

字符常量要用单引号括起来,例如上面的'}',注意单引号只能括一个字符而不能像双引号那样括一串字符,字符常量也可以是一个转义序列,例如'\n',这时虽然单引号括了两个字符,但实际上只表示一个字符。和字符串字面值中使用转义序列有一点区别,如果在字符常量中要表示双引号"和问号?,既可以使用转义序列\"和\?,也可以直接用字符"和?,而要表示'和\则必须使用转义序列读者可能会奇怪,为什么需要规定一个转义序列\?呢?因为C语言规定了一些三连符(Trigraph),在某些特殊的终端上缺少某些字符,需要用Trigraph输入,例如用??=表示#字符。Trigraph极不常用,极不常用的C语法在本书中通常不会介绍,介绍这个只是为了让读者理解转义序列的作用,即特殊字符转普通字符、普通字符转特殊字符,?号也是一种特殊字符,要表示其字面意思也需要用转义序列,但如果?号单独出现,不会被误认为是三连符,也可以不用转义序列。

在计算机中整数和小数的内部表示方式不同(将在第13章详细介绍),因而在C语言中是两种不同的类型(Type),通常小数在计算机中的表示方式称为浮点数,详见第13.4节。上例的34和3.14分别是整数常量和浮点数常量。

上例的printf语句输出结果和Hello world那个例子不太一样,字符串"character:%c\ninteger: %d\nfloating point: %f\n"并不是按原样打印输出的,而是输出成这样:

      character: }
      integer: 34
      floating point: 3.140000

printf中的第一个字符串称为格式化字符串(Format String),它规定了后面几个常量以何种格式插入到这个字符串中,在格式化字符串中%号(Percent Sign)后面加上字母c、d、f分别表示字符型、整型和浮点型的转换说明(Conversion Specification),转换说明只在格式化字符串中占个位置,并不出现在最终的打印结果中,这种用法通常叫做占位符(Placeholder)。这也是一种字面意思与真实意思不同的情况,但是转换说明和转义序列又有区别,转义序列是在编译时处理的,而转换说明是在运行时调用printf函数处理的:

● 源文件中的字符串字面值是"character: %c\ninteger: %d\nfloating point:%f\n",\n占两个字符;

● 编译之后保存在可执行文件中的字符串是character: %c换行integer: %d换行floating point: %f换行,\n已经被替换成一个换行符,而%c这两个字符不变;

● 在运行时这个字符串被传给printf,printf再把其中的%c、%d、%f解释成转换说明。

有时候不同类型的数据很容易弄混,例如"5"、'5'、5,如果你注意了它们的界定符就会很清楚,第一个是字符串字面值,第二个是字符,第三个是整数,看了本章后面几节你就知道为什么一定要严格区分它们之间的差别了。

习题

1、我们知道,用\斜线表示转义序列和在printf格式化字符串中用%号表示占位符是两种不同的机制,前者在编译时处理,后者在运行时处理。但两者在语法上具有类似的规律,想想在printf格式化字符串中怎么表示一个%字符?写个小程序试验一下。