C语言-第一章节---常量
目录
一、什么是常量?
二、宏定义
三、C语言中的运算顺序
一、什么是常量?
1.常量其实就是在程序运行过程中不可以被改变的量叫做常量。
2.常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
3.常量可以是任何的基本数据类型,比如整数常量(int)、浮点常量(float,double)、字符常量(char),或字符串字面值,也有枚举常量(enum)。
4.常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
直接常量(字面常量)
1.整形常量可以理解为是直接使用的整形常数,如:123,456,-456等。
2.整形常量可以是:长整型(long int)、短整形(short int)、有符号整形(signed int)、无符号整形(unsigned int)。
3.实型常量也称之为浮点型(单精度浮点型一foat、双精度浮点型-double),由整数和小数部分组成,并用十进制(0~9)位组成的.
4.浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常衣
5.当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用e或E引入的。
6.字符常量与之前所介绍的常量有所不同,即要对其字符型常量使用指定的定界符进行限制
7.字符常量可以分为两种:
1、字符常量(单个字符的单引号)
2、字符串常量(两个及以上双引号)
8.在这里注意一下:字符常量是区分大小写的、'A'和'a'的字符是不一样的!这两个字符代表不同的字符常量,' ' 这对单直撇代表着定界符号,不属于字符常量的一部分。在C语言中字符串常量时,系统会在字符串后面加"0",作为字符申的结束标志,每个字符常量都对应一个整数编码,所以表示一个字符有两种方式:
一、直接写出字符本身,然后用一对单引号括起来。比如'A','1'等等。但是有一些特殊字符不能这样表示,比如单引号本身,不能写成 ''',会报错,所以给这些特殊字符前面加个“\”符号标志一下,告诉编译器接下来的字符要当成普通字符来读,就像这样'\''。
二、用编码表示字符。就像用9527叫周星弛一样。具体做法是先写个斜杠,再加上编码,最后用单引号括起来。字符的编码是什么?查ASCII码表。注意这里的编码只能用八进制和十六进制,用八进制时前面加0或不加,用十六进制时前面加x。 比如'\07'和'\7'是一样的,是八进制。'\x7'是十六进制。转义符对照表:
转义序列 | 含义 |
\a | 警报(ANS IC) |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠(\) |
\' | 单引号 |
\" | 双引号 |
\? | 问号 |
\0oo | 八进制值(oo必须是有效的八进制数,即每个。可表示0~7中的一个数) |
\xhh | 十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数) |
例题:
各选项分析
A选项
234
是整数常量,-0x45
是十六进制表示的整数常量(在C、C++等语言中),-3.4
是浮点数常量,该选项均为常量,符合题意B选项
45
是整数常量,1/2
在程序设计语言中(如C、C++等)会进行整数除法运算得到0(因为两个整数相除结果为整数),而不是数学意义上的0.5,99.2
是浮点数常量。由于1/2
的结果不符合常量的预期值,所以该选项错误C选项
89
是整数常量,π
(圆周率)在程序中通常需要通过定义(如#define PI 3.1415926
等方式)来表示,不能直接写π
作为常量,56.9
是浮点数常量,所以该选项错误D选项
33.9
是浮点数常量,5.0
是浮点数常量,a
是变量而不是常量,所以该选项错误
二、宏定义
在C语言中,宏是预处理器提供的一种功能,它允许你使用一个标识符来代表一种特定的文本字符串。这种替换在编译器进行编译之前就完成了。
正确的宏定义方法是:#define【空格】宏名【空格】宏内容
宏的主要作用有:
- 简化复杂的代码:宏可以用来简化复杂的代码,使得代码更易读。
- 类型安全:宏可以用来创建类型安全的代码,避免了不正确的类型使用。
- 代码的可移植性:宏可以帮助创建与平台无关的代码。
- 性能优化:宏可以用来定义一些在不同平台有不同表现的代码,以优化程序的性能。
下面是一些宏定义的例子:
最常见的宏定义是用来定义常量的。例如:
#define PI 3.14159
用来定义函数宏,例如:
#define MIN(a, b) ((a) < (b) ? (a) : (b))
用来定义条件编译,例如:
#define DEBUG 1
#ifdef DEBUG#define DEBUG_PRINT(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else#define DEBUG_PRINT(fmt, ...)
#endif
用来定义一些特殊的宏,例如:
#define _STR(s) #s
#define STR(s) _STR(s)#define _CONCAT(a, b) a##b
#define CONCAT(a, b) _CONCAT(a, b)
用来定义类型,例如:
#define INT_TYPE int
还可以用来定义操作,例如:
#define INC(x) ((x)++)
注意:宏定义的使用应该谨慎,因为它只是进行简单的文本替换,没有类型检查,如果使用不当,可能会导致一些意想不到的问题。
如下题:
#define N 2#define M N+1#define NUM 2*M+1int main(){int i;for(i=1;i<=NUM;i++)printf("d\n",i);
}
根据宏定义可以得出:
N=2
M=N+1=3
NUM=2*M+1=2*N+1+1=6
本题易错点在于宏定义的括号问题。因此,for 循环将会执行 6次。
三、C语言中的运算顺序
在C语言中,运算符的优先级和结合性决定了表达式中各个运算对象之间的计算顺序,即运算顺序。优先级决定了运算符组合成表达式后的运算组织,结合性决定了同一优先级运算符的运算结合方向。
C语言中运算符的优先级如下:
括号 ()
单目运算符,如 ++ -- - 等
算术运算符,如 * / % + -
位移运算符,如 << >>
关系运算符,如 < > <= >=
等价运算符,如 == !=
位运算符,如 &
逻辑运算符,如 &&
条件运算符,如 ?:
赋值运算符,如 = += -= *= /= >>= <<= &= ^= |=
同一行的运算符按由左至右的方向结合,不同行的运算符优先级较高。
例如:
int a = 10, b = 20, c = 30;int result = (*p++) + (b--) * (c++);
在这个例子中,先计算括号内的++,再计算*p++,然后是b--,c++,最后是+。