目录
1.对全局变量的检测能力
- C语言中同时定义两个相同的全局变量编译器并不会报错,而c++中就会报重定义错误
#include<stdio.h>
int g_a;//bss段
int g_a=10;//data段
int main()
{
printf("%d",g_a);//最后对打印出10
return 0;
}
#include<iostream>
using namespace std;
int g_val;
//int g_val = 20;//c++会报g_val重定义
int main(void)
{
printf("%d",g_val);
}
2.struct类型增强
- C语言中创建结构体类型的变量必须加struct关键字
#include<stdio.h>
struct student
{
int id;
char name[34];
};
int main()
{
struct student s1;
//student s1;//err
return 0;
}
- c++可以不加struct结构体关键字
#include<iostream>
struct student
{
int id;
char name[43];
}
int main(void)
{
student s1;
}
3.c++中所有变量和函数都必须有类型
- C语言接受没有返回类型的函数,接受单个形参传递多个实参的情况
#include<stdio.h>
f()//函数没有返回类型默认返回类型为整形,所以在C语言中不会报错
{
return 10;
}
int g(int a)
{
return 10;
}
int main()
{
f();
g(20,30,40,50);//C语言接受单个形参传递多个实参
return 0;
}
4.c++中新增的bool类型
#include<iostream>
using namespace std;
int main()
{
bool flag=true;
flag = true;
cout<<"flag(true)="<<flag<<endl;
flag = false;
cout<<"flag(false)="<<flag<<endl;
flag=20;
cout<<"flag="<<flag<<endl;
return 0;
}
- bool类型的变量的值只有0和1两种
5.三目运算符的加强
- C语言中三目操作符不能当左值来使用
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int c=0;
//左值 右值
c=(a<b?a:b);
printf("c=%d\n",c);
(a<b?a:b)=50;//C语言中三目运算符不能当左值
//10
//10=50;
return 0;
}
- c++中三目操作符可以当左值来使用
6.const的增强
int const b; //代表一个常整形数
const int* c;//c是一个指向常整型数的指针(所指向的内存数据不能被修改,但本身可以修改)
int* const d;//常指针(指针变量不能被修改,但是他所指向的空间可以被修改)
const int* const e;//一个指向常整形的常指针(指针和它所在的内存空间,均不能被修改)
- C语言中const修饰的变量并不能改变成为常量
#include<stdio.h>
int main()
{
const int a=10;
int* p=&a;
*p=70;
return 0;
}
最后a会改变成为70,说明被const修饰的a并没有成为常量
- c++中const修饰的变量就算通过指针也不会被改变
#include<iostream>
using namespace std;
int main()
{
const int a=10;
int* p=(int*)&a;
*p=20;
cout<<"a="<<endl;
cout<<"*p="<<*p<<endl;
return 0;
}
c++中const修饰的变量在赋值时并不是在栈区开辟空间,而是在符号表。
思考:常量可以取地址吗??
答:如果对一个常量取地址,编译器会临时开辟一个空间,让这个指针存放这个临时空间的地址
7.对枚举的增强
C语言中枚举本质就是整形,枚举变量可以用任意整形赋值。而c++中枚举变量,只能用枚举出来的元素初始化。
#include<iostream>
using namespace std;
enum season
{
SPR,
SUM,
AUT,
WIN,
};
int main(void)
{
enum season s=SPR;
//s=0 //err 但是C语言可以通过
s=SUM;
return 0;
}