C++之C到C++的升级

C++中的变量可以在需要使用时再定义

#include <stdio.h>

int main(int argc, char *argv[])
{
    int c = 0;
    
    printf("Begin...\n");
    
    for(int i=0; i<10; i++) //C语言编译 ERROR
    						//C++ 正确
    {
        for(int j=0; j<10; j++)
        {
            c += i * j;
        }
    }
    
    printf("c = %d\n", c);
    
    printf("End...\n");
    
    printf("Press enter to continue ...");
    getchar();	
    return 0;
}

C++关键字register变得无效

c++编译器有自己的优化方式,不使用register也可能做优化

#include <stdio.h>

int main(int argc, char *argv[])
{
    register int c = 0;
    
    printf("Begin...\n");
    
    printf("&c = %08X\n", &c); //C语言中的寄存器地址不可取 编译ERROR
    						   //c++正确 C++中的register变得鸡肋
    
    printf("End...\n");
    
    printf("Press enter to continue ...");
    getchar();	
    return 0;
}

在C++中,不允许定义多个同名的全局变量

在C语言中,重复定义多个同名的全局变量是合法的

#include <stdio.h>

int g_var;
int g_var = 1; //C语言编译通过
 			   //C++编译 ERROR

int main(int argc, char *argv[])
{
    printf("Begin...\n");
    
    printf("g_var = %d\n", g_var);
    
    printf("End...\n");
    
    printf("Press enter to continue ...");
    getchar();	
    return 0;
}

c++中的const

#include <stdio.h>

int main(int argc, char *argv[])
{
    const int c = 0;
    int* p = (int*)&c;
    
    printf("Begin...\n");
    
    *p = 5;
    
    printf("c = %d\n", c);  //C语言 5
    				        //C++ 0	
    
    printf("End...\n");
    
    printf("Press enter to continue ...");
    getchar();	
    return 0;
}

在这里插入图片描述

C++编译器对const常量的处理

当碰见常量声明时在符号表中放入常量
编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间

注意:

C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

处理过程:

在这里插入图片描述

C语言中的const变量

C语言中const变量是只读变量,有自己的存储空间

C++中的const常量

可能分配存储空间
当const常量为全局,并且需要在其它文件中使用(extern)
当使用&操作符取const常量的地址

实例分析 C++中的const常量

#include <stdio.h>

int main(int argc, char *argv[])
{
    const int a = 1;
    const int b = 2;
    int array[a + b] = {0};
    int i = 0;
    
    for(i=0; i<(a+b); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    printf("Press enter to continue ...");
    getchar();
    
    return 0;
}

C编译器:

在这里插入图片描述

C++编译器:

在这里插入图片描述
分析:int array[a + b] = {0}; 证明在C++中的const是真正意义上的常量

C++中的const是真正意义上的常量

const常量和宏的区别:

C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5

const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换

实例分析

#include <stdio.h>

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
    printf("a = %d\n", a);
    //printf("b = %d\n", b);
}

int main(int argc, char *argv[])
{
    f();
    g();
    
    printf("Press enter to continue ...");
    getchar();
    
    return 0;
}

分析:g()中可以使用f()中的a,明显不合理

C++中struct是一种数据类型:

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

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

#include <stdio.h>

struct Student
{
    const char* name;
    int age;
};

int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30}; //C语言 ERROR struct Student s1 = {"DDD", 30};
    							 //C++正确
    Student s2 = {"Tang", 30};
    
    printf("Press enter to continue ...");
    getchar();
    
    return 0;
}

C++是一种强类型的语言:

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

C语言中的垃圾特性:

f(i)
{
    printf("i = %d\n", i);
}

g()
{
    return 5;
}

在C语言中
int f();表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数

在C++中
int f();和int f(void)具有相同的意义,都表示返回值为int的无参函数

三目运算符的升级:

C语言中的三目运算符返回的是变量值,不能作为左值使用

C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
注意:
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    
    (a < b ? a : b) = 3; //C语言 ERROR 
    				     //C++正确
    
    printf("a = %d, b = %d\n", a, b);
    
    printf("Press enter to continue ...");
    getchar();	
    return 0;
}

Q:c++怎么会直接返回变量本身那?

A:引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值