C++ c++与C语言的区别(三目运算符,const修饰符)

//区别⑦:三目运算符(C++版本)
#include<iostream>
using namespace std;

//三目运算符 C语言返回变量的值 C++语言是返回变量本身

void main(){
    int a = 10;
    int b = 20;
    a < b ? a : b = 30;
    //C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
    //注意:
    //三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
    //(a < b ? 1 : b) = 30;
    system("pause");
}
//区别⑦:三目运算符(C语言版本)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main(){
    int a = 10;
    int b = 20;
    //a < b ? a : b = 30;  报错  error C2106: “=”: 左操作数必须为左值
    //详解: 在C语言中,a < b ? a : b这里返回的a是a的值,而不是a这个变量
    //常量是不可以做左值的
    //左值在c++中很重要,元素当左值的条件是这个元素必须存在内存空间(在寄存器中的值就没有内存空间)
    
    //在C语言中实现三目运算符返回变量
    *(a < b ? &a : &b) = 30;
    system("pause");
}

 

//区别⑧:const修饰符(C++版本)
#include<iostream>

using namespace std;

//Const优点(C语言 c++共有优点)
//合理的利用const,
//1指针做函数参数,可以有效的提高代码可读性,减少bug;
//2清楚的分清参数的输入和输出特性
//例子:
//int setTeacher_err( const Teacher *p)
//Const修改形参的时候,在利用形参不能修改指针所向的内存空间

struct Teacher{
    char myname[30];
    int age;
};

void PrintfA(Teacher const *pin/*in*/){
    //pin->age = 30;   
    //报错  error C3490: 由于正在通过常量对象访问“age”,因此无法对其进行修改
    pin = (Teacher *)0x1;
}

void PrintfB(Teacher * const pin/*in*/){
    //pin = (Teacher *)0x1;
    //报错 error C3892: “pin”: 不能给常量赋值
    pin->age = 30;
}

void PrintfC(Teacher * const * pin/*in*/){
    //pin->age = 30;
    //报错 error C2227: “->age”的左边必须指向类/结构/联合/泛型类型
    //pin = (Teacher *)0x1;
    //报错 error C2440: “=”: 无法从“Teacher *”转换为“Teacher *const *”
}

void fun1(){
#define N2 10
    const int bb = 10;
    printf("变量的值是:%d\n", bb);
}

void fun2(){
    printf("变量的值是:%d\n", N2);
    //printf("变量的值是:%d\n", bb);  error C2065 : “bb” : 未声明的标识符
    //表明 #define宏定义与 const 修饰变量的作用域不同

    //关闭宏定义
#undef N2
    //#undef  后面不加参数  直接关闭所有的宏定义
    /*printf("变量的值是:%d\n", N2);  error C2065 : “N2” : 未声明的标识符*/
}

void main(){
    //const int a;
    // error C2734: “a”: 如果不是外部的,则必须初始化常量对象
    const int a=10;
    int const b = 20;

    //C++语言的间接赋值(这与C语言不同)
    int *p1 = (int *)&a;
    *p1 = 11;
    printf("a=%d\n", a);// 打印a=10
    printf("*p1=%d\n", *p1);// 打印*p1=11
    printf("&a=%x\n", &a);//打印 &a= d2f7e0
    printf("p1=%x\n", p1);// 打印 p1= d2f7e0

    //详解 const int a=10;
    //在c++中,存在一个符号表,以键值对的形式存储 const 修饰的变量 和 变量的值,
    //当c++编译器编译到 const int a=10;  这句话的时候
    //c++编译器会在符号表创建一个键值对  key 是 变量 a, value 是 10;
    //当后面程序使用到 const修饰的 a变量 的时候  c++编译器会直接从 符号表里取 a的值
    //当c++编译器 检索代码时 发现存在 &a(对 const 修饰的 a 取地址 )的操作的时候
    //c++会隐式 为 &a 分配一个内存空间  并且将 10 存入到这个内存空间
    //当程序员 *p1 = 11; 修改 *(&a) 的值的时候  修改的是个隐式创建的内存空间里的值
    //不会修改符号表中 a的数据
    //c++编译器之所以这么设计 是因为 C语言支持 对const 修饰的变量 取地址  为了兼容C语言 才如此设计的
    /*注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值(即任何时候获取a的值都是10)。*/

    char arr[a] = { 0 };//C语言中 const 常量不可以定义数组
    char temparr[a+b] = { 0 };
    
#define N 10
    char arr2[N] = { 0 };

    //C++中的const常量类似于宏定义
    //const int c = 5; ≈ #define c 5
    //C++中的const常量在与宏定义不同
    //const常量是由编译器处理的,提供类型检查和作用域检查
    //宏定义由预处理器处理,单纯的文本替换


    system("pause");
}
//区别⑧:const修饰符(C版本)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct _teacher{
    char myname[30];
    int age;
}Teacher;

void PrintfA(Teacher const *pin/*in*/){
    //pin->age = 30;   
    //报错 error C2166: 左值指定 const 对象
    pin = (Teacher *)0x1;
}

void PrintfB(Teacher * const pin/*in*/){
    //pin = (Teacher *)0x1;
    //报错 error C2166: 左值指定 const 对象
}

void PrintfC(Teacher * const * pin/*in*/){
    //pin->age = 30;
    //报错 error C2227: “->age”的左边必须指向类/结构/联合/泛型类型
    pin = (Teacher *)0x1;
    //警告 warning C4047: “=”:“Teacher *const *”与“Teacher *”的间接级别不同(这样C++不同)
}

void main(){
    const int a=10;
    //a = 1;// error C2166: 左值指定 const 对象

    //C语言的间接赋值
    int *p1 = &a;
    *p1 = 11;
    printf("a=%d\n", a);//打印 a=11
    
    //int buf[a] = { 0 };
    //报错  error C2057: 应输入常量表达式

    //以上例子说明 在C语言中  const只是个伪常量 const变量是只读变量,有自己的存储空间

    system("pause");
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值