1 define 与 const 与 typedef 与 enum
- 1 define 不是一个关键字,用于宏定义。
#define M 3 //宏常量
int i=M; //预编译期间进行宏替换,分配内存
int j=M; //再次进行宏替换,又一次分配内存!
这里的 #define 宏常量在预编译阶段进行简单替换,本身没有类型。
- 2 const 关键字之一,用于修饰只读变量。定义方法如下:
const int i=100; //此时并未将 i 放入内存
int j=i; //此时为 i 分配内存,以后不再分配!
int n=i; //没有内存分配!
const修饰指针时先忽略类型名,看const离哪个近就修饰哪个。例如:
const int *p; //修饰*p,p可变,p指向的对象不可变
int coinst *p; //修饰*p,p可变,p指向的对象不可变
int *const p; //修饰p,p不可变,p指向的对象可变
const int *const p; //修饰*p和p,p和p指向的对象都不可变
const 修饰的只读变量是在编译的时候确定值。 修饰符可以在类型说明符前,也可以在类型说明符后。例如: int const i=2;或 const int i=2;
- 3 typedef 关键字之一,用于给一个已存在的数据类型取别名
typedef struct student
{
//code
}Stu_st,*Stu_pst;
A), struct student stu1;和 Stu_st stu1;没有区别。
B), struct student *stu2;和 Stu_pst stu2;和 Stu_st *stu2;没有区别。
C),const Stu_pst stu3;
D),Stu_pst const stu3;
这里的C和D组中 const 修饰的都是stu3
Stu_pst 是 struct student {//code}; 的别名。对于编译器来说,只认为Stu_pst 是一个类型名,所以在解析的时候自然的把“Stu_pst”这个数据类型名忽略掉。
- 4 enum 关键字之一,内置类型之枚举类型
一般定义方法如下:
enum enum_type_name
{
ENUM_CONST_1,
ENUM_CONST_2,
ENUM_CONST_3,
...
ENUM_CONST_N
}enum_variable_name;
这里的 enum_type_name 是自定义的一种数据类型名; enum_variable_name 为 enum_type_name 类型的一个变量,也就是我们平时常说的枚举变量;。ENUM_CONST_1、ENUM_CONST_2、…、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。
枚举常量在编译时确定其值,可以调试,可以一次定义大量相关的常量。
2 操作符
- 1 优先级
#include<stdio.h>
int main(){
char a = 1; //a : 00000001
char b = 127; //b : 01111111
char c = a + b; //c : 10000000
printf("%d %d\n", a+b, c);
return 0;
}
输出结果为 128和-128.
我们知道,计算机是以补码对带符号数进行运算的。对于char型数据,占1个字节,8位二进制数。若表示数字,则范围是 -128~127。于是 char 型的 a, b, c的值以8位二进制数存储,将它们以整型(4字节,32位)输出时要进行位扩展。即:
// a: 00000000 00000000 00000000 00000001 // 1 的补码的位扩展
// b: 00000000 00000000 00000000 01111111 // 127 的补码的位扩展
// c: 11111111 11111111 11111111 10000000 // 1的补码加127的补码的结果的位扩展
// c: 10000000 00000000 00000000 10000000 // 补码再次求补
和的补码等于补码的和。所以 printf函数中 a+b 的补码为128的补码,即 00000000 00000000 00000000 1000000,为正数,再次求补后仍为这么多,输入结果当然为128啦; 在 print函数中 c 最高位为1,负数,再次求补后为 10000000 00000000 00000000 10000000 ,输出结果自然就是-128。
2 结合性
1 歧义表达式
a*b + c*d + e*f;
c + –c;
int a=1;
printf(“%d “,(++a)+(++a)+(++a));
fun(void){
static int i=0;
return ++i;
}
int main(){
printf("%d",fun()+fun()*fun());
return 0;
}
- 3 是否控制求值顺序