C与C++编程区别

22 篇文章 0 订阅

    转自 http://developer.51cto.com/art/200812/103804.htm &&http://blog.sina.com.cn/s/blog_4fdabc820100fsxu.html


1. 引用 &

       C++支持引用,而C中不支持引用,全部使用指针。

2. static

        a)  static可以实现隐藏功能。

       当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。只要使用extern关键字,其他源文件也可以访问到此变量。
       为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c.

       下面是a.c的内容:

char a = 'A'; // global variable
void msg()
{
   printf("Hello\n");
}

       下面是main.c的内容:
int main(void)
{
   extern char a; // extern variable must be declared before use
   printf("%c ", a);
   (void)msg();
   return 0;
}

       程序的运行结果是:
A Hello
       下如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

       b) static的第二个作用是保持变量内容的持久。
       存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

#include <stdio.h>
int fun(void)
{
   static int count = 10; // 事实上此赋值语句从来没有执行过
   return count--;
}


int count = 1;
int main(void)
{
   printf("global\t\tlocal static\n");
   for(; count <= 10; ++count)
      printf("%d\t\t%d\n", count, fun());
   return 0;
}

       程序的运行结果是:

global local static
1  10
2   9
3   8
4   7
5   6
6   5
7   4
8   3
9   2
10  1


        c)  static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
       在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘\0’。不妨做个小实验验证一下。

#include <stdio.h>
int a;
int main(void)
{
   int i;
   static char str[10];
   printf("integer: %d; string: (begin)%s(end)", a, str);
   return 0;
}

       程序的运行结果如下

integer: 0; string: (begin)(end)

       最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.

       C++中static的作用和C完全相似,但由于C++中存在封装,所以隐藏的功能并不太常用。


3. typedef struct

       typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
       在C语言中,二者是存在区别的,具体区别在于 ----- "在于使用时,是否可以省去struct这个关键字":
       若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;
       若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;

       一个c语言的例子:
       在C中定义一个结构体类型要用typedef:
typedef struct Student
{
   int a;
}Stu;
       于是在声明变量的时候就可以使用 --- "Stu stu1;" 来声明。
       如果没有typedef就必须用 ---- "struct Student stu1;" 来声明。这里的Stu实际上就是struct Student的别名。
       另外这里也可以不写Student(于是也不能使用 ----- "struct Student stu1;" 了)
typedef struct
{
   int a;
}Stu;

       在c++里很简单,直接定义:
struct Student
{
   int a;
};
       于是就定义了结构体类型Student,声明变量时直接Student stu2;

       在c++中如果用typedef的话,又会造成区别:
struct Student
{
   int a;
}stu1;//stu1是一个变量

typedef struct Student2
{
   int a;
}stu2;//stu2是一个结构体类型
       使用时可以直接访问stu1.a
       但是stu2则必须先 stu2 s2; 然后 s2.a=10;

4. struct 的成员函数

       在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。在纯C中,可以使用函数指针模拟成员函数。
struct test
{
   int a;
   int (*add)();//当函数指针指向不同的函数可以实现对不同的操作
};

int addd(int a)
{
    return ++a;
}

main()
{
    int i;
    struct test t;
    t.a=1;
    t.add=addd;
    printf("%d\n",i=t.add(t.a));
    return 0;
}



5. 函数定义

       C++支持函数重载,C不支持。下面这种定义方式在C++中是允许的,C中则不行:

// 重载函数

int Func (int,int);    
int Func (int,float);  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言和C++都是计算机编程语言,它们之间有一些不同之处。 C语言是一种过程式编程语言,主要用于系统软件开发,如操作系统、编译器、驱动程序等。它的语法简洁,易于学习,支持指针等高级特性,但没有面向对象编程的特性。 C++语言在C语言的基础上添加了面向对象编程的特性。它既支持过程式编程,又支持面向对象编程,还可以使用泛型编程和模板元编程等高级特性。C++广泛用于桌面应用程序、游戏开发、嵌入式系统等领域。 因此,虽然C语言和C++有很多共同点,但它们之间的主要区别在于C++是一种更加复杂和功能更加丰富的语言,而C语言则更加简单和直接。 ### 回答2: C语言是一种程序设计语言,它是由贝尔实验室的Dennis Ritchie在20世纪70年代开发的。它是一种通用的高级编程语言,被广泛应用于系统程序设计和应用程序开发。C语言具有简洁的语法和强大的表达能力,能够高效地执行底层的计算机操作。 相比之下,C是一种编译器软件,它可以将C语言源代码转换为可执行的机器代码。C编译器负责将C语言源代码编译成可以在特定平台上运行的二进制文件。C编译器有很多不同的实现,其中一些很著名的有GNU Compiler Collection (GCC)、Clang等。 因此,C语言和C编译器是两个不同的概念。C语言是一种程序设计语言,而C编译器是用于将C语言源代码编译为可执行文件的软件工具。 C语言具有高度可移植性和灵活性,可以在各种不同的操作系统和硬件平台上编写和运行代码。而C编译器则提供了将C语言代码转化为底层机器代码的能力,并提供了一些优化技术,以提高程序的执行效率。 总的来说,C语言是一种程序设计语言,而C编译器是将C语言源代码编译为机器代码的工具。C语言的使用广泛,而C编译器则是为了让C语言代码能够在特定平台上运行而存在的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值