C++对C语言的增强
以下面的代码最为例子
C语言:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* 1、全局变量检测增强 在C语言中,这段代码是可以编译通过的
int a;
int a = 10 */
/* 2、函数检测增强 在C语言中,这段代码是可以编译通过的
f(a, b)
{
return a * b;
}*/
/*f(a)
{
;
}*/
/* 3、类型转换检测增强
void test()
{
char * p = malloc(64);
}*/
// 4、struct 增强
struct Teacher
{
int age;
// void f(); // 在C语言中,结构体下是不可以放函数的
};
void test2()
{
struct Teacher t1;
// Teacher t2; // 在C语言中,定义结构体变量的时候必须加关键字 struct
}
// 5、bool类型增强 在C语言中,没有bool类型
// bool flag;
// 6、三目运算符增强
void test4()
{
int a = 10;
int b = 20;
printf("result = %d\n", a > b ? a : b);
*(a > b ? &a : &b) = 100;//C语言下,三目运算符返回的是值
printf("%d\n", a);
printf("%d\n", b);
}
int main(void)
{
// f(10, 10);
// test();
test4();
system("pause");
return 0;
}
C++
#include<iostream>
using namespace std;
/* 1、全局变量检测增强 在C++中,这段代码编译是会报错的
int a;
int a = 10; */
/* 2、函数检测增强 在C++中,这段代码编译是会报错的
f(a,b)
{
return a * b;
}
C++对函数形参变量类型检测增强
对函数声明的返回值类型检测增强
函数返回值检测增强
调用函数时对参数传入个数检测增强
*/
// 3、类型检测转换增强
void test()
{
//char * p = malloc(64);
char *p = (char *)malloc(64);
}
// 4、struct 增强
struct Teacher
{
int age;
void f() { age++; }; // 而在C++中,结构体下是可以放函数的
};
void test2()
{
struct Teacher t;
Teacher t1; // 在C++语言中,是可以不用加关键字的
t.age = 30;
t.f();
cout << "Teacher t.age = " << t.age << endl;
}
// 5、bool类型增强
// bool类型代表真和假 真 true — 1 假 false — 0
bool flag = true;
void test3()
{
cout << "sizeof(bool) = " << sizeof(bool) << endl;
// flag = 1000;
cout << "flag = " << flag << endl;
}
// 6、三目运算符增强
void test4()
{
int a = 10;
int b = 20;
cout << (a > b ? a : b) << endl;
a > b ? a : b = 100; // b = 100 C++中三目运算符返回的是一个变量
cout << a << endl;
cout << b << endl;
}
int main()
{
// test2();
//test3();
test4();
system("pause");
return 0;
}
const关键字增强
//const增强
const int m_a = 100; //全局const变量 受到常量区保护 表示此变量不允许被修改
void test5()
{
const int m_b = 100; // 局部const修饰的变量可以间接修改成功
//m_b = 200;
int *p = &m_b;
*p = 200;
printf("%d\n", m_b);
}
//const增强
const int m_a = 100; //与C语言一样 全局const变量 受到常量区保护 表示此变量不允许被修改
void test7()
{
const int m_b = 100; // 间接修改 m_b 的值并没有修改成功
// m_b = 200;
int *p = (int *)&m_b;
*p = 200;
cout << "m_b = " << m_b << endl;
}
// 为什么没有修改成功呢?
// 在C语言中 const修饰的局部变量是放在栈区的,栈中变量的值是可以被修改的
// 但是在C++中,这个局部变量并没有放在栈区,而是放在符号表中 &m_b取地址的时候,会产生一个临时变量
// int temp = m_b
// int *p = & m_b
// *p = 200
注意
- const在C语言下,默认是外部链接属性
- const在C++下,默认是内部链接属性
const 分配内存情况
#include<iostream>
using namespace std;
// 1、对const修饰的变量取地址时会分配临时内存‘
void test1()
{
const int m_a = 10;
int *p = (int *)&m_a;
}
// 2、const前加入extern关键字后,也会分配内存
// 3、使用变量来修饰const修饰的变量
void test2()
{
int a = 10;
const int m_a = a;
int *p = (int *)&m_a;
*p = 20;
cout << "m_a = " << m_a << endl;
}
// 4、对于自定义数据类型,也会分配内存
int main()
{
test2();
system("pause");
return 0;
}