C到C++的升级
1.变量的定义
C++中所有的变量都可以在使用的时候再定义
C中的变量都必须在作用域开始的位置定义
2.register关键字
C++为了兼容C,所以也支持register关键字,但是在C++的实际编译过程中已经忽略了register关键字,所以得出了与C中的一点不同:在C中对于register修饰的变量不可以取地址,而在C++中对于使用register修饰的变量却是可以取地址操作的
3.定义多个同名的全局变量
在C语言中,重复定义多个同名的全局变量是合法的,会把所有的连接到同一个地址
在C++中,不允许定义多个同名的全局变量
1 #include <stdio.h> 2 3 int g_v; 4 5 //int g_v;//C++中不可以定义同名的全局变量 6 7 int main(void) 8 { 9 printf("Begin...\n"); 10 int c = 0; 11 for(int i = 1;i<=3;i++) 12 { 13 for(int j = 1;j<=3;j++) 14 { 15 c += i * j; 16 } 17 } 18 printf("c=%d\n",c); 19 register int a = 0; 20 printf("&a = %p\n",&a); 21 printf("End..\n"); 22 return 0; 23 }
4.struct关键字
C语言中的struct定义了一组变量的集合
C语言中的struct定义的标识符并不是一种新的类型
C++中的struct用于定义一种全新的类型
5.标识符
C++中所有的标识符都必须显示的声明类型,在C中的默认类型在C++中是不合法的
1 #include <stdio.h> 2 3 struct Student 4 { 5 const char* name; 6 int age; 7 }; 8 9 f(i)//error,没有指定返回的类型,以及参数的类型 10 { 11 printf("i = %d\n", i); 12 } 13 14 g()//error,没有指定返回的类型,以及参数的类型 15 { 16 return 5; 17 } 18 19 20 int main(int argc, char *argv[]) 21 { 22 Student s1 = {"Delphi", 30}; 23 Student s2 = {"Tang", 30}; 24 25 f(10); 26 27 printf("g() = %d\n", g(1,2,3,4,5)); 28 29 return 0; 30 }
const关键字
C++在C的基础上对const进行了优化处理
在C++中碰见const声明时在符号表中放入常量,编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现以下情况则给对应的常量分配存储空间:
1.对const常量使用了extern
2.对const常量使用&操作符
注:C++编译器虽然会在上面的两种情况下为const常量分配空间,但是不会使用其存储空间中的值
1 #include <stdio.h> 2 3 int main() 4 { 5 const int c = 0; 6 int *p = (int*)&c; 7 printf("Begin...\n"); 8 *p = 5; 9 printf("c=%d\n",c);//c的值为0 10 printf("End...\n"); 11 return 0; 12 13 }
1 #include <stdio.h> 2 3 void f() 4 { 5 #define a 3//在预处理期间就完成了文本的替换,所以没有作用域的限制 6 const int b = 4; 7 } 8 9 void g() 10 { 11 printf("a = %d\n", a); 12 //printf("b = %d\n", b); 13 } 14 15 int main() 16 { 17 const int A = 1; 18 const int B = 2; 19 int array[A + B] = {0};//在C编译器中,因为const修饰的变量未只读变量,在运行中才可以知道数组的大小故会报错而在C++编译器中const修饰的变量是真正意义上的常量,A和B直接使用符号表中的变量替换 20 int i = 0; 21 22 for(i=0; i<(A + B); i++) 23 { 24 printf("array[%d] = %d\n", i, array[i]); 25 } 26 printf("a = %d\n", a); 27 f(); 28 g(); 29 30 return 0; 31 }
布尔类型和引用
C++在C语言基本类型系统的基础上增加了bool(布尔)类型
C++中的bool可取的值只有true(非0)和false(0)这两个值,
C++编译器会把非0值转换为true,0值转换为false
理论上bool只占用一个字节
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 bool b = false; 6 int a = b; 7 8 printf("sizeof(b) = %d\n", sizeof(b)); 9 printf("b = %d, a = %d\n", b, a); 10 11 b = 3; 12 a = b; 13 14 printf("b = %d, a = %d\n", b, a); 15 16 b = -5; 17 a = b; 18 19 printf("b = %d, a = %d\n", b, a); 20 21 a = 10; 22 b = a; 23 24 printf("a = %d, b = %d\n", a, b); 25 26 a = 0; 27 b = a; 28 29 printf("a = %d, b = %d\n", a, b); 30 31 return 0; 32 }
三目运算符
C语言中的三目运算符返回的是变量值,故不可以作为左值使用
C++中的三目运算符可直接返回变量本身(返回的是变量的引用),故既可以作为左值又可以作为右值使用
注:三目运算符返回的值中如果有一个是常量值,则与C语言中的用法一样,返回的是变量的值
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int a = 1; 6 int b = 2; 7 (a<b?a:b) = 3; 8 printf("a = %d,b = %d\n",a,b); 9 10 return 0; 11 }
引用
1.引用可以看成是一个已经定义的变量的别名
2.语法:Type &name = var;
注:普通引用在定义时必须用同类型的变量进行初始化
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int a = 4; 6 int& b = a; 7 8 b = 5; 9 10 printf("a = %d\n", a); 11 printf("b = %d\n", b); 12 printf("&a = %p\n", &a); 13 printf("&b = %p\n", &b); 14 15 return 0; 16 }
原文:https://www.cnblogs.com/yekongdebeijixing/p/13647218.html