实用性加强:
int main()
{
// C语言中的变量都必须在作用域开始的位置定义!!
// C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
for (int i = 0; i < 10; i++)
{
std::cout << i << std::endl;
}
return 0;
}
register关键字的变化:
register关键字请求“编译器”将局部变量存储于寄存器中
C语言中无法取得register变量地址
在C++中依然支持register关键字
1、C++编译器有自己的优化方式,不使用register也可能做优化
2、C++中可以取得register变量的地址
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
#include <stdio.h>
int main4_1()
{
// 申请寄存器变量
register int a = 10;
// 在C++中 如果对一个寄存器变量进行取地址操作,该变量将被改回普通变量
// register定义将会失效
printf ("&a = %p, a = %d\n", &a, a);
return 0;
}
变量检测加强:
#include <stdio.h>
// 在C语言中重复定义多个全局变量是合法的
// 这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
int g_a;
int g_a = 1;
int main()
{
printf ("%d\n", g_a);
printf ("%p\n", &g_a);
return 0;
}
在C语言中只有一个全局作用域
C语言中所有的全局标识符共享同一个作用域
标识符之间可能发生冲突
在C++中不允许定义多个同名的全局变量
struct类型加强:
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明
#include <stdio.h>
struct Student
{
char name[20];
int age;
void print()
{
printf ("id = %d, name = %s\n", id, name);
}
};
int main()
{
// C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型
// 所以在定义变量的时候需要在前面加上 struct 关键字进行修饰
// C++中 struct 定义了一种新的数据类型,可以直接用来定义变量
Student stu1 = {"xiaoming", 10};
// 2、结构体中可以放函数
stu.print();
printf ("size = %d\n", sizeof(Student));
return 0;
}
函数参数:
#include <stdio.h>
// 如果一个函数没有参数,C++认为这是一个无参函数,不能给函数传参
void func()
{
printf ("hello world\n");
}
// C语言中一个无参函数定义是用void进行填充
void func1(void) // 等价于 func1()
{
}
// C++中函数参数必须要有类型
void func2(int a)
{
printf ("%d\n", a);
}
int main1_1()
{
func();
// func(1.2,4,5,"adasd");
// func1(1,2.3);
// func2(3.2);
return 0;
}
新增bool类型:
C++中的布尔类型
C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节,
如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false
#include <stdio.h>
int main2_3()
{
bool b = true;
if (b) // 判断是否为真
{
}
if (!b) // 判断是否为假
{
}
float f = 0.0000000000001;
if (f + 0.000001 > 0 && f - 0.000001 < 0) // 与0进行比较
{
}
return 0;
}
// bool类型:值有2中,true 和 false true 的值 是1 false 值是 0
// 用 0 来表示 false, 非0 表示 true
int main2_2()
{
bool b = false;
int a = 0;
b = a - 1;
b++;
b = -100;
printf ("%d\n", b);
return 0;
}
int main2_1()
{
printf ("%d\n", true);
printf ("%d\n", false);
return 0;
}
三目运算符:
#include <stdio.h>
// C语言中表达式的结果 放在什么地方? ==> 寄存器
// 表达式返回的是一个值,是一个数
// 在C++中,表达式返回的是变量本身
// 2 如何做到的
// 让表达式返回一个内存空间..内存的首地址 指针
// 在C语言中如何实现C++的效果
// 3 本质
// C++编译器自己做了取地址的操作
int main()
{
int a = 10;
int b = 20;
// C++中三目运算符返回的是变量本身,所以可以作为左值使用
(a > b ? a : b) = 90;
// 在C语言中让三目运算符可以当左值使用,可以通过返回变量地址实现
*(a > b ? &a : &b) = 90;
printf ("%d, %d\n", a, b);
return 0;
}
1)C语言返回变量的值 C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
(a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
====>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已