c++三目运算符与c++中的const深入理解

目录

前言:

1、三目运算符的增强

 2、c中的const

总结:

3、c++中的const

4、c++中的const在什么情况下系统会为其分配空间

1、对于基础数据类型,编译器会把它放到符号表中,当对其去地址的时候,会分配内存。

2、 对于基础数据类型,如果一个变量初始化const变量,例如const int a = b,那么也是会给a分配内存。

3、对于自定义数据类型,比如类对象,那么也会为其分配内存。


前言:

 C/C++ 三目运算符是一种条件运算符,也被称为“三元运算符”或“条件运算符”。它的语法结构为 condition ? true_expression : false_expression,表示如果 condition 为真,则执行 true_expression,否则执行 false_expression。

1、三目运算符的增强

c语言三目运算表达式返回值为数据值,为右值,不能赋值

void test() {
	int a = 10;
	int b = 20;
	printf("c的三目运算符结果:%d", a > b ? a : b);
    //a > b ? a : b =100;  err,如果把a>b?a:b当做整体然后赋值,此时会报错,因为c返回的是b的结果。
	
}

运行结果:

c++三目运算表达式返回值为变量本身(引用),为左值,可赋值

void test() {
	int a = 10;
	int b = 20;
	cout << (a > b ? a : b)<<endl ;
	a > b ? a : b=100;
	cout << (a > b ? a : b)<<endl;
}
int main() {
	test();
}

运行结果: 

 2、c中的const

1、在c中的const修饰全局变量默认的是外部连接(外部连接是指其他源文件可以使用),修饰的是一个不能改变的只读变量,并且为其变量开辟空间。

下面是c中在两个不同的文件中对const修饰的变量的使用:    

main.c

const int a = 10; //a的本质是一个只读变量

test.c

extern const int a;
void test1() {	
	printf("a=%d", a);
}
int main(){
    test1();
}

运行结果:

注意:在c中,const修饰的变量,用户不能通过用户名对a进行赋值;但是由于a是一个变量,在c中会为其变量开辟一个地址,这时如果知道a的地址,就可以通过a的地址间接修改a所对应空间中的内容。

例如:

#include <stdio.h>
void test1() {
    const int a = 10;
    printf("a=%d\n", a);
    int* p = (int*)&a;
    *p = 100;//通过a的地址修改a所占内存中的内容
    printf("a=%d",a);
}
int main()
{
   test1();
    return 0;
}

运行结果: 

总结:

1、const修饰全局变量,变量名只读,内存空间在文字常量区(只读),不能通过变量的地址,修改变量所占内存中的内容。

2、const修饰局部变量,变量名只读,内存空间在栈区(可读可写),可以通过变量的地址,修改变量所占内存中的内容。

3、c++中的const

1、在c++中的const修饰全局变量默认的是内部连接(内部连接是指当前源文件可以使用),只能作用于当前文件,其他文件不可见。

例如:

main.c 

const int num = 100;

test.c

extern const int num;//变量声明
void test() {
	cout << "全局变量的num:" << num << endl;
}
int main() {
	test();
}

运行结果:

 此时发现,在main.c中定义的num,在test.c中没有被定义,此时说明在c++中,const修饰的变量作用于当前源文件。

注意:如果需要使用其他源文件中定义的变量,此时可以在const前面加上extern将内连接转换为外部连接。

main.c

extern const int num = 100;

test.c

extern const int num;
void test() {
	cout << "全局变量的num:" << num << endl;
}
int main() {
	test();
}

运行结果:

在c++中,如果像在c中一样,通过获取变量地址,间接修改变量所占内存空间中的内容,此时是否可以修改成功呢

下面我们一起来看一下!

void test() {
	const int num = 100;
	cout << "局部变量num:" << num << endl;
	int* p = (int*)&num;
	*p = 2000;
	cout << "*p=" << *p << endl;
	cout << "局部变量num:" << num << endl;
}
int main() {
	test();
}

运行结果:

此时发现num的空间内容修改成功,但是最后运行结果中显示num的值还是100,并没有被修改成功,这是为什么呢?

这是因为在c++中,一个const不必创建内存空间,是否为其创造空间,取决于如何使用,一般来说,const修饰的常量,如果把其用一个值代替的话(就像使用#define一样),那么就不用为其创造空间。

1)、c++对于基础类型,系统不会为其开辟空间,而是将其放到符号表中 

2)此时需要对num进行取地址的时候,此时系统就会给num开辟空间 

此时通过修改指针修改num所占空间中的值,使得num所占内存中的值修改成2000,但是符号表中num的值却没有发生改变。因此当通过指针访问变量的值得到的结果为2000,但是通过变量名访问的时候,访问的是符号表中的值,因为num还是等100。

4、c++中的const在什么情况下系统会为其分配空间

1、对于基础数据类型,编译器会把它放到符号表中,当对其去地址的时候,会分配内存。

2、 对于基础数据类型,如果一个变量初始化const变量,例如const int a = b,那么也是会给a分配内存。

void test() {
	int b = 20;
	const int a = b;//此时系统为a分配内存了,因此不会将a放入符号表中
	cout << "局部变量a:" << a << endl;
	int* p = (int*)&a;
	*p = 1000;
	cout << "*p=" << *p << endl;
	cout << "局部变量a:" << a << endl;		
}
int main() {
	test();
}

运行结果:

3、对于自定义数据类型,比如类对象,那么也会为其分配内存。

struct Person
{
	int num;
	string name;
};
void test() {
	const Person per = { 001,"张三" };
	cout << "学号为:" << per.num << ",姓名为:" << per.name << endl;
	Person *p = (Person *)&per;
	p->num = 002;
	p->name = "李四";
	cout << "学号为:" << per.num << ",姓名为:" << per.name << endl;
}

int main() {
	test();
}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚笛诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值