const double d = 9.1;
double const d2 = 9.2; //const放double后或double前效果一样
double d3 const = 9.3; //error.不能放在变量名后。const修饰函数名时可以放在函数名后。
const double *dp = &d; //dp为一个指针,指向一个const double。 赋值(*dp)=9.2;将导致错误
double const * dp2 = &d; //const放double后或double前效果一样
const double * const dp3 = &d; //dp为一个const指针,指向一个const double。
const double const * const dp4 = &d; //导致warning(重复的修饰),这句话等同于:const const double * const dp4 = &d;
const double d = 9.1;这句比double const d2 = 9.2;常见。不过后者我认为更确切,看下面:
typedef char *cstring;
char *cstr = "ab";
const cstring cstr = "cd"; //这一句相当于下面的哪一句?
const char *cstr2;
char *const cstr3; //与这句效果相同
语句const cstring cstr = "cd"; 与char *const cstr3;等效,而不是与const char *cstr2;等效。
原因:const cstring cstr = "cd"; 与cstring const cstr3;等效。
所以将const置于修饰的类型的后面比放在类型的前面好,比如:
double const d2 = 9.2; //not: const double d = 9.1;
double const *dp = &d; //not: const double *d =&d;
double const * const dp31 = &d; //not: const double * const dp3 = &d;
将double叫double变量,叫double const叫double不变量。这就不绕口了。
double const d2 = 9.2; //const放double后或double前效果一样
double d3 const = 9.3; //error.不能放在变量名后。const修饰函数名时可以放在函数名后。
const double *dp = &d; //dp为一个指针,指向一个const double。 赋值(*dp)=9.2;将导致错误
double const * dp2 = &d; //const放double后或double前效果一样
const double * const dp3 = &d; //dp为一个const指针,指向一个const double。
const double const * const dp4 = &d; //导致warning(重复的修饰),这句话等同于:const const double * const dp4 = &d;
const double d = 9.1;这句比double const d2 = 9.2;常见。不过后者我认为更确切,看下面:
typedef char *cstring;
char *cstr = "ab";
const cstring cstr = "cd"; //这一句相当于下面的哪一句?
const char *cstr2;
char *const cstr3; //与这句效果相同
语句const cstring cstr = "cd"; 与char *const cstr3;等效,而不是与const char *cstr2;等效。
原因:const cstring cstr = "cd"; 与cstring const cstr3;等效。
所以将const置于修饰的类型的后面比放在类型的前面好,比如:
double const d2 = 9.2; //not: const double d = 9.1;
double const *dp = &d; //not: const double *d =&d;
double const * const dp31 = &d; //not: const double * const dp3 = &d;
将double叫double变量,叫double const叫double不变量。这就不绕口了。