• 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符


    1、“实用性”增强

    C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。

    2、C++对c语言register的增强

    register关键字 请求编译器让变量a直接放在寄存器里面,速度快
    在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容

    1
    register关键字的变化
    register关键字请求“编译器”将局部变量存储于寄存器中
    C语言中无法取得register变量地址
    在C++中依然支持register关键字
    C++编译器有自己的优化方式,不使用register也可能做优化
    C++中可以取得register变量的地址

    2
    C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。

    3

    早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。

    #include <iostream>  
      
    int main()  
    {  
        register int a = 0;  
      
        printf("&a = %x
    ", &a); // c语言这里会报错  
      
        for (int i = 1; i < 1000; i++) { // 而对于这种频繁使用i的情况自动进行优化,将i放入寄存器中  
            printf("%d
    ", i);  
        }  
      
        system("pause");  
        return 0;  
    }  

    3、变量检测加强

    在C语言中,重复定义多个同名的全局变量是合法的;在C++语言中,不允许定义多个同名的全局变量。C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。

    4、struct类型增强

    C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型;

    C++中的struct是一个新类型的声明。

    #include <iostream>
    struct Student
    {
        char name[100];
        int age;
    };
    
    int main(int argc, char *argv[])
    {
        struct Student s1 = { "wang1",1 };  //在C中需要struct Student s1,而c++不需要加Struct关键字
        struct Student s2 = { "wang2",2 };  //在C中需要struct Student s2
    
        return 0;

    5、C++中所有变量和函数都必须有类型

    C++中所有的变量和函数都必须有类型,C语言中的默认类型在C++中是不合法的;

    “函数f的返回值是什么类型?”、“参数又是什么类型?”、“函数g可以接受多少个参数?”

    //在C语言中,以下不报错,但是在c++中,必须定义返回值的类型和参数的类型,及确定参数个数,不能定义函数时和调用函数时的参数个数不同。
    #include <stdio.h>
    
    f(i) //没有定义返回值的类型和参数的类型
    {
        printf("i=%d
    ",i);
    }
    
    g()  //参数个数问题
    {
        return 5;
    }
    int main()
    {
        f(10);
        g(1);
        g(1, 2, 3);
        return 0;
    }
    在C语言中
        int f( );表示返回值为int,接受任意参数的函数
        int f(void);表示返回值为int的无参函数
    在C++int f( );和int f(void);具有相同的意义,都表示返回值为int的无参函数
        C++更加强调类型,任意的程序元素都必须显示指明类型

    6、新增bool类型关键字

    C++在C语言的基本类型系统之上增加了bool,C++中的bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现。

    true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示。

    bool类型只有true(非0)和false(0)两个值,C++编译器会在赋值时将非0值转换成true,0值转换为false。

    #include <iostream>
    
    using namespace std;
    
    int main(int argc, int *argv[])
    {
        int a;
        bool b = true;
        printf("b=%d,sizeof(b)=%d
    ", b, sizeof(b));//b=1,sizeof(b)=1
    
        b = 4;
        a = b;
        printf("a=%d,b=%d
    ", a, b);//a=1,b=1
    
        b = -4;
        a = b;
        printf("a=%d,b=%d
    ", a, b);//a=1,b=1
    
        a = 10;
        b = a;
        printf("a=%d,b=%d
    ", a, b);//a=10,b=1
    
        b = 0;
        printf("b=%d
    ", b);//b=0
    
        return 0;
    }

    7、三目运算符功能加强

    1)C语言返回变量的值,C++语言是返回变量本身。C语言中的三目运算符返回的是变量值,不能作为左值使用;C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地

    2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用,如:(a < b ? 1 : b )= 30;
    3)C语言如何支持类似C++的特性呢?
    当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已。

    #include <iostream>
    
    using namespace std;
    
    int main(void)
    {
        int a=10;
        int b = 20;
        //返回一个最小值,并且给最小值赋值成30
        //三目运算符是一个表达式,表达式不可能做左值
        (a < b ? a : b) = 30;
        printf("a=%d,b=%d
    ", a, b);
    
        return 0;
    }
  • 相关阅读:
    vim 多个文件切换
    Ruby 格式化代码 vim
    Ruby 配置vimrc
    print puts p
    开机跳过开机选择系统的选项界面
    Linux学习笔记:rm删除文件和文件夹
    Linux学习笔记:ps -ef、ps aux、kill -9
    Linux学习笔记:ctrl+z、ctrl+c、ctrl+d的区别
    Shell学习笔记:<<EOF子命令
    Linux学习笔记:crontab定时任务
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/10603494.html
Copyright © 2020-2023  润新知