宏和常量都是C层级的。其中宏是预处理过程的,真正到编译的时候宏已经没了比如
#define N 10
printf("%d\n", N);
最后交给编译器的是
printf("%d\n", 10);
常量严格说是常变量,区分直接写的1, 'x', "abc"这种“常量”(literal)
常变量本质上仅仅是不允许修改的变量。但是实现上,因为在编译的时候值已经确定,编译器会直接使用值,不进行读取变量的操作。
const int i = 0;
原则是仅仅是不允许再对i进行复制而已。
但是对于下面写
int x = i;
编译器可能会直接将其作为int x = 0处理。另外不要尝试用任何手段对常变量赋值(也就是说其实可以赋值),因为你这么之后在不同编译器上会得到不同的结果。
枚举类似性质上类似于“常量”而不是“常变量”
enum
{
a = 1,
b,
}
int x = a;
编译器就是作为int x = 1处理的。或者说a就是1。上面那个a其实还是个保存着1的变量
#define N 10
printf("%d\n", N);
最后交给编译器的是
printf("%d\n", 10);
常量严格说是常变量,区分直接写的1, 'x', "abc"这种“常量”(literal)
常变量本质上仅仅是不允许修改的变量。但是实现上,因为在编译的时候值已经确定,编译器会直接使用值,不进行读取变量的操作。
const int i = 0;
原则是仅仅是不允许再对i进行复制而已。
但是对于下面写
int x = i;
编译器可能会直接将其作为int x = 0处理。另外不要尝试用任何手段对常变量赋值(也就是说其实可以赋值),因为你这么之后在不同编译器上会得到不同的结果。
枚举类似性质上类似于“常量”而不是“常变量”
enum
{
a = 1,
b,
}
int x = a;
编译器就是作为int x = 1处理的。或者说a就是1。上面那个a其实还是个保存着1的变量