C++在C语言基础之上增强的几个实用特性总结

变量的定义

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

#include <iostream>
using namespace std; 

int main11()
{
  int i = 0; 

  printf("ddd");
  int k; // 这段代码在vc6,C语言编译情况下就会报错。就是因为这里的定义
  system("pause");
  return 0;
}

对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变量是一个很好的补充。
demo

#include <iostream> 

int main()
{
  register int a = 0; 

  printf("&a = %x\n", &a); // c语言这里会报错 

  for (int i = 1; i < 1000; i++) { // 而对于这种频繁使用i的情况自动进行优化,将i放入寄存器中
    printf("%d\n", i);
  } 

  system("pause");
  return 0;
}

对C语言的变量检测增强

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

#include <stdio.h>
int g_var;
int g_var = 1;
// C语言可以编译通过
// C++直接拒绝这种二义性
int main(int argc, char *argv[])
{
  printf("g_var = %d\n", g_var);
  return 0;
}


struct类型增强

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

struct Student
{
  char name[100];
  int age;
}; 

int main(int argc, char *argv[])
{
  // C语言中需要在定义结构体的时候加struct,而C++不需要
  Student s1 = { "wang", 1 };
  Student s2 = { "wang2", 2 };
  return 0;
}

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

C语言中的默认类型在C++中是不合法的,比如说函数f的返回值是什么类型,参数又是什么类型? 函数g可以接受多少个参数?
更换成.cpp就会报错

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

} 

g()
{
  return 5;
} 

int main(int argc, char *argv[])
{ 

  f(10); 

  printf("g() = %d\n", g(1, 2, 3, 4, 5)); 

  getchar();
  return 0;
}

三目运算符的增强

在C语言中表达式的结果放在寄存器中,在C语言中,表达式的返回值是变量的值,在C++中,表达式返回的是变量的本身。

int main(){int a = 10;int b = 20;// 返回一个最小数,并且给最小数赋值成3

三目运算符是一个表达式,表达式不可能做左值,所以这个在C语言中无法编译通过

(a < b ? a : b) = 30;

而在C++中就可以编译运行。C语言中也可以实现相同的功能:

(a < b ? &a : &b) = 30;return 0;}

C++中const加强

C语言中的const是一个冒牌货。

int main()
{
  // 好像a是一个常量
  const int a = 10;
  int *p = NULL;
  p = (int *)&a;
  *p = 20; // 间接赋值 

  printf("a:%d\n", a);
  // C语言中显示a被修改了
  // C++则显示a还是10,没有改变 

  return 0;
}

C++中的const是一个真正的常量。
解释:
C++编译器对const常量的处理。
当碰见常量声明时,在符号表中放入常量。
编译过程中若发现使用常量则直接以符号表中的值替换。
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)。

(0)

相关推荐

  • 马尔可夫链算法(markov算法)的awk、C++、C语言实现代码

    1. 问题描述 马尔可夫链算法用于生成一段随机的英文,其思想非常简单.首先读入数据,然后将读入的数据分成前缀和后缀两部分,通过前缀来随机获取后缀,籍此产生一段可读的随机英文. 为了说明方便,假设我们有如下一段话:   复制代码 代码如下: Show your flowcharts and conceal your tables and I will be mystified. Show your tables and your flowcharts will be obvious. 假设前缀的长

  • 探讨register关键字在c语言和c++中的差异

    在c++中: (1)register 关键字无法在全局中定义变量,否则会被提示为不正确的存储类. (2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中. 在c中: (1)register 关键字可以在全局中定义变量,当对其变量使用 & 操作符时,只是警告"有坏的存储类". (2)register 关键字可以在局部作用域中声明,但这样就无法对其使用 & 操作符.否则编译不通过. 建议不

  • C语言、C++中的union用法总结

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这个问题,也希望大家和我讨论讨论.别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信.我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了).重构(后期我也会说的了)了,却忽略了那些最基础,最

  • C语言、C++内存对齐问题详解

    这也可以? 复制代码 代码如下: #include <iostream> using namespace std;   struct Test_A {      char a;      char b;      int c; };   struct Test_B {      char a;      int c;      char b; };   struct Test_C {      int c;      char a;      char b; };   int main() {

  • C语言/C++中如何产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件. 使用rand()函数获取一个随机数如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 例子

  • c语言读取csv文件和c++读取csv文件示例分享

    C读取csv文件 复制代码 代码如下: #include <stdio.h>#include <string.h> char *trim(char *str){    char *p = str;     while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')        p ++;    str = p;     p = str + strlen(str) - 1;     while (*p == ' ' ||

  • C++在C语言基础之上增强的几个实用特性总结

    变量的定义 C语言中的变量都必须在作用域开始的位置定义!!  C++中更强调语言的"实用性",所有的变量都可以在需要使用时再定义. #include <iostream> using namespace std; int main11() { int i = 0; printf("ddd"); int k; // 这段代码在vc6,C语言编译情况下就会报错.就是因为这里的定义 system("pause"); return 0; }

  • IOS开发之路--C语言基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift 这么看下去还有大量的内容需要持续补充,但是今天我们从最基础的C语言开始,C语言部分我将分成几个章节去说,今天我们简单看一下C的一些基础知识,更高级的内容我将放到后面的文章中. 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): Hello World 运行过程 数据类型 运算符 常用

  • Go语言基础学习教程

    本文实例讲述了Go语言基础知识.分享给大家供大家参考,具体如下: GO文件目录结构 该图是go-windows的目录结构 如图,go的程序应该是在gopath文件夹下的,分为bin, pkg, 和src三个子文件夹 src文件夹:每个次级文件夹(如demo)就是代表一个go项目,里面存放源程序 bin文件夹:go的每个项目生成的二进制可执行程序.windows下会生成.exe文件,linux下会生成可执行文件.Go的最大特色之一就是可移植性,就是说,当生成一个demo.exe之后,将这个exe文

  • C 语言基础教程(我的C之旅开始了)[八]

    19. 基本数据类型:复数类型和虚数类型 C99 新增了复数类型(_Complex)和虚数类型(_Imaginary).简单来说,C99 提供了三种复数类型:float _Complex,double _Complex,和 long double _Complex.对于 float _Complex 类型的变量来说,它包含两个 float 类型的值,一个用于表示复数的实部(real part),另一个用于表示虚部(imaginary part).类似地,double _Complex 包含两个

  • C#语言基础——结构体和枚举类型全面解析

    一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,其实就是一个自定义

  • go语言基础语法示例

    周末天气不好,只能宅在家里,于是就顺便看了一下Go语言,觉得比较有意思,所以写篇文章介绍一下.我想写一篇你可以在乘坐地铁或公交车上下班时就可以初步了解一门语言的文章.所以,下面的文章主要是以代码和注释为主.只需要你对Java,Python,C等编程语言有一点基础,我相信你会在30分钟左右读完并对Go语言有一些初步了解的. 本文的唯一目的,就是希望大家阅读之后,能够了解go语言长什么样子... Hello World package main //声明本文件的package名 import "fm

  • Android Studio使用recyclerview实现展开和折叠功能(在之前的微信页面基础之上)

    Android中RecyclerView点击item展开列表详细内容 效果如下: 依然是xml文件的设计,使用了两个RelativeLayout,zu作为主布局和副布局,里面都加入textview显示内容,在副布局里加入一个imageview在这里插入图片描述作为子内容的背景图,代码如下: tab01.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&qu

  • C 语言基础----详解C中的运算符

    C语言中又有哪些运算符呢? 如下所示: ※ 算术运算符 ※ 赋值运算符 ※ 关系运算符 ※ 逻辑运算符 ※ 三目运算符 C语言基本算术运算符如下表: 除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如果两数中有一个为小数,结果则为小数. 取余运算中注意: 该运算只适合用两个整数进行取余运算 运算后的符号取决于被模数的符号,如(-10)%3 = -1;而10%(-3) = 1. 注:C语言中没有乘方这个运算符,也不能用×,÷等算术符号. 赋值运算符 下表列出了 C 语

  • C语言基础使用IDE快速开发的方法

    这篇文章介绍一下如何使用CLion进行C语言的开发与调试. CLion CLion是Jeb Brain出品的一款跨平台的C/C++的集成开发环境IDE. 详细介绍: https://www.jetbrains.com/zh-cn/clion/ 下载地址: https://www.jetbrains.com/zh-cn/clion/download/ 官方提供了30天试用的方式,可根据需要进行下载使用. 安装与设定 首先选择缺省主题 然后选择缺省插件 习惯使用vim方式的可以通过点击对应的Inst

  • 模块一 GO语言基础知识-库源码文件

    你已经使用过 Go 语言编写了小命令(或者说微型程序)吗? 当你在编写"Hello, world"的时候,一个源码文件就足够了,虽然这种小玩意儿没什么用,最多能给你一点点莫名的成就感.如果你对这一点点并不满足,别着急,跟着学,我肯定你也可以写出很厉害的程序. 我们在上一篇的文章中学到了命令源码文件的相关知识,那么除了命令源码文件,你还能用 Go 语言编写库源码文件.那么什么是库源码文件呢? 在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他

随机推荐