C语言和C++的几点不同之处,const,register,三目运算符,&引用

1、先说register吧

在c++中:

(1)register 关键字无法在全局中定义变量,否则会被提示为不正确的存储类。

(2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中。

在c中:

(1)register 关键字可以在全局中定义变量,当对其变量使用 & 操作符时,只是警告“有坏的存储类”。

(2)register 关键字可以在局部作用域中声明,但这样就无法对其使用 & 操作符。否则编译不通过。

2、const

c语言可以通过下面方式修改const

const  int  a = 10;

int  *p = &a;

*p = 11;

但是C++不行,据说c++是再声明const的时候会在电脑某个区域创建一个键值对,之后就只许读,不许写,去过你非要写成上面的形式,编译器也不会报错,为了兼容,编译器会为a开辟一个内存然后付给p,这时候你随便修改这块内存,但是当你读a的时候他是不会来这里取数据的,而是直接取走键值对中的数据,所以说C++的常量更严格

3、三目运算

首先先看一个例子(a < b ? a : b )= 30;

他在c语言中是无法编译通过的,但是再c++中可以编译通过,为什么呢?因为在语言中(a < b ? a : b )返回的是一个常量,但是再c++中他返回的却是a或b的地址,这是因为c++做了改进,编译器遇到此句话时候会自动转为*(a < b ? &a : &b ),但c语言不会这样做,可以在c语言中*(a < b ? &a : &b )=30这样写试一下,发现可以编译通过,也可以在C++中这样写(a < b ? 4 : b )= 30;发现会编译不通过,这就证明了前面的推断是正确的

4、&引用

c++中的引用相当于创建了一个常量指针变量

int a = 10;

int &b = a;

b = 11;

相当于int * const b = a;那么问题来了,既然b是指针为什么用的时候没有*呢,这是因为,c++编译器会自动为我们处理,这句话听着好熟悉啊,对,你做不到的推给编译器就行,呵呵

对于引用做返回值的问题

#include "stdafx.h"

#include "iostream"
using namespace std;


int myf1()
{
	int a ;
	a = 10;
	return a;
}

int& myf2()
{
	int a ;
	a = 11;
	printf("a:%d", a);
	return a;
}

int* myf3()
{
	int a ;
	a = 12;
	return &a;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int b1 = myf1(); //ok
	int b2 = myf2();  //返回了一个值,返回赋给b2
	int &b3 = myf2(); //b3 返回值的引用
	int &d = b2;
	printf("b1:%d\n", b1);
	printf("b2:%d\n", b2);
	printf("b3:%d\n", b3); //b3是一个引用类型 c++编译器会帮我们执行 *p 
	printf("b3:%d\n", d);  //d也会做*p,但是d所指向的内存空间没有被释放掉,所以不是乱码 
	system("pause");
	return 0;
}


int& j()
{
	static int a ; // 静态的不会被析构,所以不会乱码
	a = 10;
	printf("a:%d", a);
	return a;
}

int main02()
{
	int b1 = j(); //ok
	int b2 = j();  //返回了一个值,返回赋给b2
	int &b3 = j(); //b3 返回值的引用
	printf("b1:%d\n", b1);
	printf("b2:%d\n", b2);
	printf("b3:%d\n", b3); //b3是一个引用类型 c++编译器会帮我们执行 *p 
	system("pause");
	return 0;
}

引用的好处是引用当左值,如下

//static int a  = 10; 把a变成一个状态变量
//a初始化的时候10 ,只初始化一次
//a = 11 
int& mygg()
{
	static int a  = 10;
	printf("a:%d", a);
	return a;
}

int main03()
{
	mygg() = 11;
	mygg();
	system("pause");
	return 0;
}

int& myA(int &a)
{
	a++;
	return a;
}
void main77()
{
	int b = 10;
	int b1 = myA(b); //ok
	int b2 = myA(b);  //返回了一个值,返回赋给b2
	int &b3 = myA(b); //b3 返回值的引用
	printf("b1:%d\n", b1); //11
	printf("b2:%d\n", b2);//12
	printf("b3:%d\n", b3); //13
	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值