C語言和C++的區別整理詳解!

c和c++主要區別

根據書中的描述,進行了整理

推薦一個我自己的C/C++交流裙815393895

1、 源代碼文件的擴展名

摘自1.4.1

C++實現源代碼文件的擴展名UNIXC、cc、cxx、cGNU C++C、cc、cxx、cpp、c++Digital Marscpp、cxxBorland C++cppWatcomcppMicrosoft Visual C++cpp、cxx、ccFreestyle Code Warriorcp、cpp、cc、cxx、c++

另外UNIX系統上的C程序的擴展名為.c

2、變量定義

摘自2.2.1

c語言中,所有的局部變量必須在函數或復合語句開始位置,c++沒有這個限制。

void main()

{

int a; //define variable a

int b; //define variable b

a = 10;

printf("a=%d \n", a);

b = 11;

printf("b=%d \n", b);

{

int temp = 0;

printf("test variable in processing\n");

}

}

注釋:

a、局部變量a和b位于函數開始位置,變量temp位于復合語句的開始位置。

b、復合語句(摘自5.1.10):使用兩個花括號來構造一條復合語句(代碼塊)。代碼塊由一對花括號和它們包含的語句組成。

3、 auto

摘自3.4.5

c語言中, auto用于聲明變量為自動變量,auto修飾符的定義里有這么一句“進入包含變量聲明的代碼時,變量開始存在。當程序離開這個代碼塊時,自動變量消失了。它所占用的內存可用來做別的事情。”,從“當程序離開代碼塊時變量消失”、“內存可用來做別的事情”可以推出auto修飾的變量是存儲在堆棧中的。而全局變量存儲在靜態存儲區中,所以用auto決不能修飾全局變量。

C++11標準引入auto類型說明符,用它就能讓編譯器替我們去分析表達式所屬的類型

與原來那些只對應一種特定類型的說明符不同,auto讓編譯器通過初值來推算變量類型。顯然,auto定義的變量必須要有初始值。

auto i=0,*p=&i; //正確,i是整數,p是整形指針

4、stuct

摘自4.4

在C語言中, struct類型的定義必須加上struct的前綴

struct opt {

int len;

int value;

};

void main()

{

struct opt tmp;

tmp.len = 1;

tmp.value = 2;

}

而在C++中,struct可以直接使用其類型名來定義

#include <iostream>

struct opt {

int len;

int value;

};

int main()

{

opt tmp;

tmp.len = 1;

tmp.value = 2;

std::cout<<tmp.len<<std::endl;

std::cout<<tmp.value<<std::endl;

return 0;

}

相比之下,C++的語法更簡潔一些。所以在用C語言編寫代碼的時候,C程序員通常是這么來定義的struct的。在下面的代碼中,使用typedef來定義一個opt的類型

typedef struct _opt {

int len;

int value;

}opt;

void main()

{

opt tmp;

tmp.len = 1;

tmp.value = 2;

}

5、stuct初始化

推薦一個我自己的C/C++交流群 815393859

摘自4.4.2

與數組一樣,c++11也支持將列表初始化用于結構,且等號(=)是可選的:

opt tmp {1, 2};

其中不允許縮窄轉換,例如:

opt tmp {1.0, 2};

編譯報錯:

error: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { }

c語言可以使用列表初始化,但是等號(=)是必須的。

opt tmp = {1,2};

6、枚舉的取值范圍

摘自4.6.2

c++現在通過強制類型轉換,增加了可以賦值給枚舉變量的合法值。

每個枚舉都有取值范圍,通過強制類型轉換,可以將取值范圍中的任何整數賦值給枚舉變量,即使這個值不是枚舉值例如,假設bits 和myflag 的定義如下:

enum bits{ one=1,two=2,four=4,eight=8};

bits myflag;

則下面的代碼是合法的:

myflag=bits(6);//正確,因為 6在bits的范圍

取值范圍的定義:首先,要找出上限,需要知道枚舉量的最大值。找到大于這個最大值的、最小的2的冪,將它減去1,得到的便是取值范圍的上限。

?

例如對于:

enum bigstep{first,second = 100,third};

最大枚舉值是101,在2的冪中,比這個值大的最小的值為128,因此取值范圍上限為127.

要知道下限,需要知道枚舉量的最小值.如果它不小于0,則取值范圍的下限為0.否則,采取與尋找上限方式同樣的方式,但加上負號,

例如,如果最小的枚舉量為-6,則比它小的,2的冪最大的值為-8,加1之后為-7.于是,上限與下限便能算出來.

c語言中不能定義這樣的變量:bits myflag;

7、for循環

摘自5.1

C++11新增一種循環:基于范圍(range-based)的for循環:簡化一種常見的循環任務:對數組(或容器類,如vector和array)的每個元素執行相同的操作.

格式如下:

for(Type VarName : Array){

  //每個元素的值會依次賦給 VarName

}

示例:

double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};

for (double x : prices)

std::cout<<x<<std::endl;

?

8、邏輯運算符的另一種表示

摘自6.2.6

并不是所有的鍵盤都提供了用作邏輯運算符的符號,標識符and、or和not都是c++保留字,這意味著不能將它們用作變量名等。它們不是關鍵字,因為它們都是已有語言特性的另一種表示方式。另外,它們并不是c語言中的保留字,但c語言程序可以將它們用作運算符,只要在程序中包含了頭文件iso646.h.

邏輯運算符:另一種表示方式

運算符另一種表示方式&&and||or!not

9、c++字符庫函數cctype

摘自6.3

cctype中通常包括一些常用函數的判斷,如某個字符是否為大寫,用isupper()如果參數是大寫字母,函數返回true, 還有像isalnum(),如果參數是字母數字,即字母或者數字,函數返回true.

函數名稱 返回值

isalnum() 如果參數是字母數字,即字母或者數字,函數返回true

isalpha() 如果參數是字母,函數返回true

isblank() 如果參數是水平制表符或空格,函數返回true

iscntrl() 如果參數是控制字符,函數返回true

isdigit() 如果參數是數字(0-9),函數返回true

isgraph() 如果參數是除空格之外的打印字符,函數返回true

islower() 如果參數是小寫字母,函數返回true

isprint() 如果參數是打印字符(包括空格),函數返回true

ispunct() 如果參數是標點符號,函數返回true

isspace() 如果參數是標準空白字符,如空格、換行符、水平或垂直制表符,函數返回true

isupper() 如果參數是大寫字母,函數返回true

isxdigit() 如果參數是十六進制數字,即0-9、a-f、A-F,函數返回true

tolower() 如果參數是大寫字符,返回其小寫,否則返回該參數

toupper() 如果參數是小寫字符,返回其大寫,否則返回該參數

10 、wchar_t 和C++11新增類型:char16_t char32_t

摘自3.1.8

wcha_t:

wchar_t是C/C++的字符類型,是一種擴展的存儲方式,主要用在國際化程序的實現中。

wchar_t 存在的原因:

char是八位字符類型,最多能包含256中字符,許多的外文字符集所包含的字符數目超過256個,char型不能表示。

wchar_t數據大小:

數據類型一般為16或者32位,不同的C/C++庫有不同的規定。總之:wchar_t所能表示的字符遠遠多于char類型。

wchar_t的輸入輸出處理:

cin和cout將輸入和輸出看作是char流,因此不適合用于處理wchat類型,iostream頭文件提供了wcin 和wcout用于處理輸入輸出流另外可以通過加上前綴L來只是寬字符常量和寬字符串。

char16_t和char32_t:

產生原因:

隨著編程人員日益的熟悉Unicode,類型wchar_t顯然已經滿足不了需求,在計算機系統上進行的編碼字符和字符串編碼時,僅僅使用Unicode碼點顯然是不夠的,

比如:如果在進行字符串編碼時,如果有特定長度和符號特征的類型將很有幫助,而類型wchar_t的長度和符號特征隨實現而已,因此C++11新增了類型char16_t,char32_t。

char16_t:無符號類型,長16位,

char32_t無符號類型,長32位

C++11使用前綴u表示char16_t字符常量和字符串常量如:u‘L’;u“lilili”;

C++11使用前綴U表示char32_t字符常量和字符串常量如:U'L';U"lilili";

類型char16_t與/u00F6形式的通用字符名匹配,

類型char32_t與/U0000222B形式的通用字符名匹配。

前綴u和U分別指出字符字面值的類型為char16_t和char32_t。

11、函數重載

摘自8.4

C++ 允許多個函數擁有相同的名字,只要它們的參數列表不同就可以,這就是函數的重載(Function Overloading)。借助重載,一個函數名可以有多種用途。

void test(int tmp1, int tmp2)

{

std::cout << tmp1 <<std::endl;

std::cout << tmp2 <<std::endl;

}

void test(double tmp1, double tmp2)

{

std::cout << tmp1 <<std::endl;

std::cout << tmp2 <<std::endl;

}

函數的重載的規則:

函數名稱必須相同。

參數列表必須不同(個數不同、類型不同、參數排列順序不同等)。

函數的返回類型可以相同也可以不相同。

僅僅返回類型不同不足以成為函數的重載。

C++ 是如何做到函數重載的

C++代碼在編譯時會根據參數列表對函數進行重命名。當發生函數調用時,編譯器會根據傳入的實參去逐個匹配,以選擇對應的函數,如果匹配失敗,編譯器就會報錯,這叫做重載決議(Overload Resolution)。

在C語言中,不存在函數重載,原因為以函數名來唯一區分一個全局函數。?而在c++中 以函數名+參數列表來唯一區分函數。

12、引用

摘自8.2

引用(reference)是c++對c語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣。其格式為:類型 &引用變量名 = 已定義過的變量名。

引用的特點:

1. 一個變量可取多個別名。

2. 引用必須初始化。

3. 引用只能在初始化的時候引用一次 ,不能更改為轉而引用其他變量。

總結:

1. 不要返回一個臨時變量的引用。

2. 如果返回對象出了當前函數的作用域依舊存在,則最好使用引用返回,因為這樣更高效。

* 引用和指針的區別和聯系

1. 指針是一個實體,而引用僅是個別名;

2. 引用使用時無需解引用(*),指針需要解引用;

3. 引用只能在定義時初始化一次,之后不能改變指向其它變量(從一而終);指針變量的值可變。

4. 引用必須指向有效的變量,指針可以為空。

5. sizeof指針對象和引用對象的意義不一樣。sizeof引用得到的是所指向的變量的大小,而sizeof指針是對象地址的大小。

6. 指針和引用自增(++)自減(--)意義不一樣。

?

7. 相對而言,引用比指針更安全。

8. 從內存分配上看:程序為指針變量分配內存區域,而引用不需要分配內存區域。

* 相同點:兩者都是地址的概念,指針指向一塊兒內存,其內容為所指內存的地址;引用是某塊兒內存的別名。

指針比引用更為靈活,但是其風險也很大。使用指針時一定要檢查指針是否為空(NULL),且空間回收后指針最好置零,以免野指針的發生造成內存泄漏等問題。

#include <iostream>

int main()

{

struct student{

std::string name;

int num;

};

student lily = {"andrew", 168};

const student &ref = lily;

student *p = &lily;

std::cout << sizeof ref<< "= sizeof ref\n";

std::cout << sizeof p<< "= sizeof pointer\n";

}

執行結果:

16= sizeof ref

8= sizeof pointer

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531175.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

揭示C語言函數調用的本質解析

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得到…

C語言的關鍵字和詳細介紹

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得到…

【C語言簡介】C語言的前世今生

C語言的發展歷史&#xff1a; 20世紀70年代初&#xff0c;貝爾實驗室的Dennis Richie 等人在B語言基礎上開發出C語言&#xff0c;最初是作為UNIX的開發語言&#xff1b; 20世紀70年代末&#xff0c;隨著微型計算機的發展&#xff0c;C語言開始移植到非UNIX環境中&#xff0c;并…

C語言/C++編程學習:不找C/C++的工作也要學C/C++的原因

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的 C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得…

C\C++中聲明與定義的區別

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的 C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得…

C++ 虛函數和虛繼承解析

本文針對C里的虛函數&#xff0c;虛繼承表現和原理進行一些簡單分析&#xff0c;有不對的地方請指出。下面都是以VC2008編譯器對這兩種機制內部實現為例。 有喜歡或者想學習C/C的朋友加一下我的C/C交流群815393895。謝謝大家的支持 虛函數 以下是百度百科對于虛函數的解釋&a…

【網絡攻防】精通C語言的黑客才是真正的黑客!

精通C語言的黑客才是真正的黑客 黑客界&#xff0c;有兩樣重要的課程&#xff0c;一是計算機的本質&#xff0c;二是編譯原理。相對于匯編等底層語言&#xff0c;它簡單&#xff1b;相對于其它高級語言&#xff0c;它更為接近計算機&#xff1b;同樣它對黑客的兩大課程很有幫助…

我兩小時學完指針,你學會數組/指針與函數需要多久?

數組與函數&#xff1a; 這段函數中 函數的參數是數組&#xff0c;注意數組作為函數參數時&#xff0c;數組名和數組元素個數時分別傳遞的。 指針與函數&#xff1a; 這段函數中的參數是指針變量&#xff0c;傳入的是數組的數組名或者首元素的地址&#xff0c;然后用引領操作…

【C語言】C語言結構解析

C 程序結構 在我們學習 C 語言的基本構建塊之前&#xff0c;讓我們先來看看一個最小的 C 程序結構&#xff0c;在接下來的章節中可以以此作為參考。 喜歡編程的或者想學習編程的朋友可以加一下我的C語言編程交流群815393895&#xff0c;謝謝大家的支持 C Hello World 實例 C…

每一個程序員都是自學成才?

為什么CS學位并非是成為開發人員的唯一路徑&#xff0c;因為每個開發人員在工作于他們的項目時學到了很多很多。 學習編程并不難 有興趣學習或者已經在學習C語言的朋友可以加一下我的編程交流群815393895 除了CS學位&#xff0c;還有很多成為程序員的方法。如果你正行進在一…

不妨問問自己,學習C語言是為了什么?

1、首先是雞湯&#xff0c;也就是為什么要學C語言。你可以先問自己&#xff0c;為什么我要學C語言&#xff1f;是為了應付考試&#xff0c;還是為了應聘&#xff0c;還是為了提高自己的編程能力。我想說的是&#xff0c;如果你打算以后長期從事計算機方面的工作&#xff0c;你就…

C語言靈魂——算法!

程序的靈魂—算法 一個程序應包括&#xff1a; 對數據的描述。在程序中要指定數據的類型和數據的組織形式&#xff0c;即數據結構&#xff08;data structure&#xff09;。 對操作的描述。即操作步驟&#xff0c;也就是算法&#xff08;algorithm&#xff09;。 Nikiklaus Wir…

為什么會有那么多人放棄編程?

為什么許多編程人員最后都放棄了呢&#xff1f;小編幫你理清下原因&#xff0c;主要有以下幾個 為什么這么多人選擇放棄學習編程&#xff1f; 加班加點是家常便飯 在軟件行業不加班的公司不是很多&#xff0c;區別就是加班強度。為什么程序員需要加這么多班&#xff0c;軟件是一…

C語言基礎知識梳理

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的 C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得到…

很多人大一就開始學習C語言,你真的學到了嗎?

好多人大一就學了C語言&#xff0c;但你有沒有感覺學的不深&#xff0c;不扎實。或者說越學越迷茫&#xff0c;不知道它能做什么 我相信&#xff0c;這可能是很多朋友的問題&#xff0c;其實&#xff0c;這是很多初學者都會踩到的一個坑&#xff01;C語言本身是一門很簡單的語言…

C語言發展歷史,C語言特點,C語言利于弊,入門須知三招

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的 這些是C/C能做的 服務器開發工程師、人工智能、云計算工程師、信息安全&#xff08;黑客反黑客&#xff09;、大數據 、數據平臺、嵌入式工程師、流媒體服務器、數據控解、圖像處理、音頻視頻開發工程…

程序員怎么看待C語言?最偉大?最落后?

一&#xff0c;前言 對我來說&#xff0c;C語言應該可以算得上是世界上最偉大的編程語言。全中國口氣最大的程序員&#xff0c;業界稱之為“垠神”&#xff0c;曾經發過文章吐槽過業界各種主流的編程語言&#xff08;對Java&#xff0c;的Python稍微寬容一些&#xff09;&…

如何學習C語言?就是這么簡單粗暴!

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的。 C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理…

C/C++對編程的重要性!其他編程語言都是弟弟!

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的 C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得…

C語言其實不難,只是你沒有找對方法!

C語言是面向過程的&#xff0c;而C&#xff0b;&#xff0b;是面向對象的 C和C的區別&#xff1a; C是一個結構化語言&#xff0c;它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程&#xff0c;對輸入&#xff08;或環境條件&#xff09;進行運算處理得…