C和C++的一些区别(变量的定义,const关键字,全局变量,函数参数,结构体,三目运算)

定义变量:

C语言里一个函数里需要用到的变量,需要集中在函数开头出定义(有的编译器可能有优化,允许在函数体别的地方定义变量),否则编译器会报错。

在C++中变量可以在任意地方定义(尽量减少变量的作用域 -----> 尽可能延迟变量的定义 -----> 什么时候用,什么时候定义)

eg:for (int i = 0; i < 10; i++)  //i是一个局部变量,只在for循环里有效
       {
           printf("%d\n", i);
       }
       int a; //延后定义

       a = 10;


Const:

在C语言中 用const修饰变量, 会让变量具有只读属性,其本质上还是一个变量。但不能对只读变量进行赋值操作,

如果希望改变const变量可以通过指针来对变量在内存中的空间进行操作,从而改变const变量的值。

eg:

int main()

{

    const int a = 10;//变量a在内存中有它自己的空间
    // a = 20; 这样操作编译器会报错
    

    int *p = (int *)&a; //定义一个指针指向a在内存空间中的地址
    *p = 20; //对p所指向的内存空间赋值
    
    printf("%d\n", a);
    return 0;

}


在C++中const用来定义常量用const去修饰一个变量,该变量将变为一个常量

C++中 常量 会放在一张常量表中,当编译器检测到要对 const常量进行取地址操作时,它会为const常量分配一个空间,但const常量不会使用这个空间,当程序用到const常量的值的时候,编译器会在常量表中调出原先存储的const常量的值进行替换。

eg:

int main()

{

    const int a = 10;//a是一个常量, 此时内存空间中并没有为a分配空间。

    int *p = (int *)&a; //编译器检测到对a进行取地址操作,为a分配空间;定义一个指针p指向a在内存空间中的地址
    *p = 20; //对p所指向的内存空间赋值, p == &a,两者数值(地址)上相同
    
    printf("a = %d, *p = %d\n", a, *p);//  结果:a = 10;*p = 20;
    return 0;

}

全局变量

在C语言中,全局变量可以重定义,使用的是同一块地址空间

int count;

int count = 10;

int main()

{
    return 0;
}

编译不报错;

在C++中, 不支持重复定义,编译不会通过。


函数参数:

C语言中函数参数可以没有类型;而在C++中函数的参数必须要有类型,否则编译不会通过。

eg://C语言里

void func(a)
{
    printf("%d\n", a);//输出无效值

}

int main()
{
    func(2.3);
    return 0;

}

在C语言里,如果一个函数参数没有参数(形如:void func()),那么这个函数可以接受任意个参数,但并不使用;

如果希望一个函数是无参函数可用void对参数进行填充(形如: void func(void));


在C++中,形如:void func()的函数被认定为一个无参函数,不予许进行函数传参,否则编译报错,等价于C中的

void func(void)。


对寄存器变量的操作

定义一个寄存器变量需要用的关键字register(register int a = 10;)变量a的值会直接放到寄存器中(不放入内存空间里)提高了运行效率。

ps:通常情况下cpu处理数据的流程是:数据先从内存中流入寄存器中,cpu再从寄存器中读取数据,处理完后再放入寄存器,最后再流入内存中)

在C语言中,不能对寄存器变量进行取地址操作(寄存器没有地址)。编译不会通过

在C++中,如果对一个寄存器变量进取地址操作(识别操作在编译期间完成),该变量将被改回普通变量(原先的类型)重新放回到内存中,register定义将会失效。编译可通过


结构体

struct Student
{
int id;
char name[20];
};

C语言不认为结构体是一种新的变量类型,只是一种数据的集合,所以在定义变量的时候要指定struct关键字

eg: struct Student s;

C++认为结构体是一种新的变量类型,可以直接用来定义变量,而且结构体中可以放函数

eg: Student s1;


三目运算

int  a = 10;

int  b = 20;
int c;

c = (a> b ? a : b);//a和b谁的值大,就把它的值赋值给c

在C++中三目运算符返回的是变量本身,可以做左值使用 eg:(a> b ? a : b) = 100;//a和b谁的值大,就把谁重赋值为100

三目运算符如果要做左值,返回的表达式中必须没有常量 eg: (a> b ? a : 10) = 100;//编译报错,10为常量,而C++中三目运算返回的是变量

在C中三目运算符返回的是值,不是变量,所以不能作为左值使用 (a> b ? a : b) = 100;//这样的操作编译不予通过

想要达成上述操作可将表达式改动为:

*(a > b ? &a : &b) = 100;//将返回值改成返回a或b的地址,通过对地址内容的赋值来改变a或b的值(*加上地址,代表地址所表示空间内的数值),C++中的三目运算也是通过由系统使用这种方式来达成目的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值