C++在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)。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
c语言
c语言实用小程序、c语言大学实用教程、vfp和c语言哪个更实用、c语言实用程序、实用c语言编程 pdf,以便于您获取更多的相关知识。

时间: 2024-10-28 10:46:23

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

利用简洁的C语言代码解决跳台阶问题与约瑟夫环问题_C 语言

跳台阶问题 题目: 一个台阶总共有 n 级,如果一次可以跳 1 级,也可以跳 2 级. 求总共有多少总跳法,并分析算法的时间复杂度. 分析: 也是比较基础的题目,通过递归可以方便的求解 代码实现如下(GCC编译通过): #include "stdio.h" #include "stdlib.h" int function(int n); int main(void) { int tmp; tmp = function(5); printf("%3d\n&q

C语言中操作进程信号的相关函数使用详解_C 语言

C语言signal()函数:设置信号处理方式头文件: #include <signal.h> 定义函数: void (*signal(int signum, void(* handler)(int)))(int); 函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数. 当指定的信号到达时就会跳转到参数handler 指定的函数执行. 如果参数handler 不是函数指针, 则必须是下列两个常数之一: 1.SIG_IGN 忽略参数signum 指定的信号. 2.

c语言中数组名a和&amp;amp;a详细介绍_C 语言

最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷> 先说说a和&a的区别(有三点,三个方向):1.是a和&a的本质,都是什么类型的.2.从2维数组的角度看.3.从指针运算的角度看. 声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧. 第一个问题:int a[10];  a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&

C语言中的数组和指针汇编代码分析实例_C 语言

今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 复制代码 代码如下: #include "stdafx.h" int main(int argc, char* argv[]) {        char a=1;        char c[] = "

C语言安全编码之数组索引位的合法范围_C 语言

C语言中的数组索引必须保证位于合法的范围内! 示例代码如下: enum {TABLESIZE = 100}; int *table = NULL; int insert_in_table(int pos, int value) { if(!table) { table = (int *)malloc(sizeof(int) *TABLESIZE); } if(pos >= TABLESIZE) { return -1; } table[pos] = value; return 0; } 其中:p

C语言中结构体(struct)的几种初始化方法_C 语言

本文给大家总结的struct数据有3种初始化方法      1.顺序      2.C风格的乱序      3.C++风格的乱序 下面通过示例代码详细介绍这三种初始化方法. 1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍.顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化:允许只初始化部分成员:在被初始化的成员之前,不能有未初始化的成员. 示例: struct User oneUser = {10, "Lucy", "/home/Lucy"}; 2

C语言求两个字符串的最长公共子串_C 语言

本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * str3); int stringLength(char * str); void main(){ char str1[50]; char st

C++基础之this指针与另一种“多态”_C 语言

一.引入定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数. 一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量.而对于同一个类的每一个对象,都是共享同一份类函数.对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成员变量是哪个对象的.这种用于对成员变量归属对像进行区分的东西,就叫做this指针.事实上它就是对象的地址,这一点从反汇编出来的代码可以看到. 二.分析1.测试代码: 复制代码 代码如

C语言实现最长递增子序列问题的解决方法_C 语言

本文实例展示了C语言实现最长递增子序列问题的解决方法.分享给大家供大家参考.具体方法如下: 问题描述: 给定一个序列,找出其最长递增子序列长度. 比如 输入 1 3 7 5 输出 3 算法解决思路: 利用动态规划的思想,以序列的每个点最为最右端,找出每个点作为最右端时的子序列长度的最大值,即问题的求解.因此,在计算前面的每个点的时候,将其结果保存下来,后面的点与前面的点的数值进行比较,如果大,则在其长度基础上加1,并且找出所有可能情况下最长的保存为当前点的长度.形成递归. 具体实现代码如下: #