嵌入式c++学习——c到c++的扩展(二)

本文探讨了从C语言到C++语言的关键变化,包括register关键字的行为差异、struct的增强特性、三目运算符的功能扩展、新增的bool类型以及const修饰符的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c到c++的扩展,也使得一些关键词发生变化下面进行列举
1,register关键字的变化
register关键字的作用是请求编译器让变量直接放在寄存器里面,以提升变量的访问速度
用register关键字修饰的变量,在c语言中是不可以用&操作符取地址的,
列如

#include <stdio.h>
int main ()
{
     register int a = 0 ;
     printf (“&a=%p\n”,&a);
     return 0;
}

上面的代码保存到main.c函数中是显示printf那行报错,但是如果写成main.cpp时是可以运行的
在这里插入图片描述
在这里插入图片描述
出现这种情况是因为:在c++中对一个寄存器变量取址操作时。register对变量的声明无效

2,struct的加强
在c++中,加强了对struct的使用,在c语言中,定义一个如下变量

struct Student
{
        int a ;      //  进行赋值是需要带上struct。如struct Student = {1} ;
                              但是在c++中,可以去掉struct      
 }

3,三目运算符的加强

在c语言中三目运算符返回的是变量的值,而在c++中三目运算符返回的是变量本身,是可以左值的
下面两个例子做对比就可以理解了

#include <stdio.h>
int main ()
{
        int a = 10  ;
        int b = 15 ;
        
        (a>b ? a:b) = 40 ;
        printf ("%d",b) ;
        return 0 ;
}

在这里插入图片描述

#include <iostream>

using namespace std ;
int main ()
{
      int a = 10 ;
      int b = 15 ;
      (a>b ? a:b ) = 40 ;
      cout << b << endl ;
      return 0 ;
      
}

在这里插入图片描述
4,bool 类型
在c语言中没有从语法上彻底支持“真” 和“假”,只是用 1 和 0 表示 ;而在tc++中,新增加了bool类型
可以识别真假,它一般只占用一个字节,bool类型只有两个取值——true和false,在编译器内部用 1 来带变
例如

#include <iostream>
 
using  namespace std ;

int main () 
{
     int a ;
     bool b = true ;
     cout << b << endl ;
     cout <<sizeof(b) << endl
     return 0 ;
     
}

在这里插入图片描述
即使你对a进行赋值,在与b进行交换,也无法改变b的值
例如

#include <iostream>
 
using  namespace std ;

int main () 
{
     int a ;
     bool b = true ;
     cout << b << endl ;
     cout <<sizeof(b) << endl

     b = 4 ;
     a = b ;
     cout << a << endl ;
     cout << b << endl ;
     return 0 ;
     
}

在这里插入图片描述
5,const的区别
在c语言中const修饰的是只读变量,本质是变量,有自己的存储空间,const的含义是不能通过被修饰的变量名来改变存储空间的值,并不是说这块存储空间的值不能被改变
如下代码所示

#include<stdio.h>
 int main ()
 {
          const int a = 10 ;
          int *p = (int *)&a ;    // &a是变量a所代表的的内存空间的首地址,
          *p = 20 ;
          printf ("a = %d \n",a );
 }

结果 a= 20

而在c++中,const修饰的是一个真正的常量,const常量会被编译器放入符号表中,一般情况下编译器不会为const常量分配空间,但是,当我们对一个const常量取地址或者extern操作时,编译器就会为该常量
分配空间,值得注意的是,当我们使用const常量时,值是从符号表中获取的,而不是分配的存储空间中的值
如下

#include<iostream>
 
 using namespace std ;
 
 int main ()
 {
          const int a = 10 ;
          int *p = (int *)&a ;    
          *p = 20 ;
          cout << "&a = %p " << &a << endl ;
           cout << "p = %p " << p << endl ;
           cout << "&a = %d " << &a << endl ;
            cout << "*p = %d " << *p << endl ;
            return 0 ;
 }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值