结构体
//c中的结构体
struct Stu{
int num;
//c语言中不允许在结构体中定义成员函数
//void func(){}
}
struct Stu init={10};
//c++中的结构体
struct Stu{
int num;
//c++中允许在结构体中定义成员函数
void func(){}
}
Stu init1={10}; //c++中可以省略 struct
三目运算符
c语言三目运算表达式返回值为数据值,为右值,不能赋值
int a=10;
int b=20;
//a>b?a:b 整体结果右值,数据值(不能被赋值)
a>b?a:b=100;//err 不能被赋值
c++中三目运算表达式返回值为变量本身(引用),为左值,可以赋值。
int a=10;
int b=20;
//a>b?a:b 整体结果是变量本身(引用)左值,能被赋值
【左值与右值】
c++中可以放在赋值操作符左边的是左值,可以放到赋值操作符右边的是右值。有些变量即可以当左值,也可以当右值。左值Lvalue,L代表Location 表示内存可以寻址,可以赋值。右值为Rvalue,R代表Rread,可以知道它的值。eg: int temp = 10; temp在内存中有地址,10没有,但是可以Read到它的值。
const
c中的const 理解为 “一个不能改变的全局只读变量”,const修饰的只读变量是外部连接的。如果这样写 const int arrSize=10; int arr[arrsize];
看似是一件合理的编码,但是这将独处一个错误。因为arrSize 占用某快内存,所以C编译器不知道编译时的值。
//全局只读变量
//外部链接:其它源文件可以使用。内存在常量池中(只读)
const int num=100;
//某个文件 : 声明 num
extern const int num;
void test(){
//num=100; err num只读,但可以给其它变量赋值
//局部只读变量 内存在栈区(可读可写),用户不能通过变量名data进行赋值
//但可以通过指针间接修改data所对应的内容
const int data = 100;
int* p=(int *)&data;
*p=200;
printf("%d\n",data); //200
}
c++中的一个const无创建内存空间,而c中一个const总是需要一块内存空间。不过对const修饰取地址或把它定义为 extern 则会为该cosnt创建内存空间。c++中函数之外的 const 作用于该文件(其它文件不可访问),默认为内部连接。
//cosnt修饰的全局变量默认是内部链接(只在当前文件有效)
//如果必须用在其它源文件,加extern 将num转化成外部链接
const int num=100;
//外部链接
extern const int num=100;
//外部某文件 声明
extern const int num;
void test(){
printf("%d\n",num);//100
const int data =100;
//data=200; err只读
int *p = (int *)&data;
*p=200;
cout << *p << endl; //修改成功 200
cout << data << endl;//data 仍旧是100 ???
//c++中对于基础类型 系统不会给data开辟空间只是将data放入符号表中(k-v)对
//当以变量的形式初始化 const 修饰的变量,系统会为其开辟空间
int b=100;
const int a=b; //系统直接为a开辟空间 而不会把a放入符号表中
p=(int *)&a;
*p=300;
cout << *p << endl;//300
cout << a << endl; //300
//cosnt 会给自定义类型(结构体,对象)分配空间
const Stu s ={20};
cout << s.name << endl; //20
Stu *s1 = (Stu *)&s;
s1->num = 30;
cout << s.name << endl;//30
}
const 与 #define
1、cosnt有类型,可以进行编译器类型检查。#define 无类型,不可以进行类型检查。
2、const有作用域。#define无作用域,默认定义处到文件结尾。如果定义在指定作用域下有效的常量,用cosnt。