1.c++中所有变量可以在使用前定义。
for(int i = 0 ; i<5 ; i++) { for(int j = 0 ; j<5 ; j++) { do_sth; } }
2. c++ 中可以获得 register 变量的地址。
register 关键字是请求编译器将局部变量设置为寄存器变量。
(如果有代码要取 register 变量的地址,编译器将变量的 register 属性变无效)
3. c++ 中不可以定义两个同名的全局变量。
4. c++ 中 struct 定义了一种全新的类型
struct student { char* name; int age; };
5. c++中所有标识符必须显示的声明,不支持默认类型。
int fun(); //error
6. const 关键字
1. 在c语言中 const 为变量
const 高数编译器其修饰的变量在编译期只可做左值。编译期有空,运行期无用。
const 修饰的全局变量在只读存储区分配空间,修饰的局部变量在栈上分配空间。
只有枚举enum定义的标识符才是常量。
int main(void) { const int a=0; int *p = (int *)&a; *p = 5;
printf("%d",a);// c++ 0
// c 5
printf("%d",*P);// C++ 5 }
2. 在c++中 const 为真正地常量
编译器在编译const 修饰的变量时直接将其对应的符号表中放入常量值,在其后遇到该常量时将符号表的常量值取出并替换成常量值。
例外: 在 & extern 操作符和关键字修饰时为常量分配存储空间,但不会使用储存空间的值(兼容C语言)。
3. 在c++中const什么时候为只读变量?什么时候为常量?
a. 使用字面量初始化的const常量是真正的常量,进入常量符号表。
b. 使用变量初始化的const常量是只读变量,不进入常量符号表。
c. 被volatile修饰的const常量是只读变量,不进入常量符号表。
d. 在编译期间无法确定初始值的const常量是只读变量,不进入常量符号表。
volatile const int y = 2; // y为只读变量 int* p = const_cast<int*>(&y); // p为普通变量 *p = 6; printf("y = %d ", y); // 6 printf("p = %d ", *p); // 6 const int z = y; // z为只读变量
const int x = 1; // x为真正的常量,将x放入常量符号表中。
const int& rx = x; // rx为只读变量,编译器为x创建了四字节空间,并让rx作为空间的别名。
int& nrx = const_cast<int&>(rx); // nrx为普通变量,去掉只读变量rx的只读属性,代表的内存空间时rx的内存空间。
nrx = 5;
printf("x = %d
", x); // 1
printf("rx = %d
", rx); // 5
printf("nrx = %d
", nrx); // 5
printf("&x = %p
", &x); // addr1
printf("&rx = %p
", &rx); // addr1
printf("&nrx = %p
", &nrx); // addr1
7. 布尔类型
bool 类型用一个字节存储,取值 ture / false (C++关键字)
ture 编译器内部用1表示,表示真。
false编译器内部用0表示,表示非真值。
布尔类型支持数学运算,运算结果将被转换(将非0值转化为ture,将0值转化为false)
bool a=0; printf("%d",a); // 0 a++; printf("%d",a); // 1 a-=3; printf("%d",a); // 1
8. 三目运算符
int a = 1, b = 2; (a < b) ? a : b = 3;
(a < b) ? a : 2 = 3; //error
c: 三目运算符返回表达式中 a 变量的值
c++:三目运算符返回表达式中 a 变量本身,只有a,b为变量才可以将整个表达式作为左值。
当三目操作符可能返回中都是变量时,返回的是变量的引用。
当三目操作符可能返回中有常量时,返回的是值。
int a = 1,b = 2; (a < b)? a : b = 3; // 返回a或b的引用 (a < b)? 1 : b = 3; // 返回1或b的值 error