目录
1、对于基础数据类型,编译器会把它放到符号表中,当对其去地址的时候,会分配内存。
2、 对于基础数据类型,如果一个变量初始化const变量,例如const int a = b,那么也是会给a分配内存。
前言:
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*)#
*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();
}
运行结果: