C 回顧之C與C 區別 00

2021-07-30 07:09:15 字數 2464 閱讀 2083

對階段性筆記進行整理,以便簡單回顧

const int a;//c語言中編譯可以通過,c++中不可以通過

int const a;//兩個一樣的

char *p = malloc(100); //c中可以編譯可以通過,c++中不可以通過

c語言直到c99標準才增加了對布林型別的支援,關鍵字為_bool,因為bool已經被c++用了,所以選了這個十分奇怪的關鍵字。

bool:c++內建對布林型別的支援,其關鍵字是bool。布林型,一般1個位元組;取值false和true,是0和1的區別。c++編譯器將會在賦值時將非0值轉換為true,0轉換為false.

bool: int型,據編譯環境決定,一般4個位元組

c語言沒有真正的列舉型別,例子:

enum day today;

today = 100; //c中可以通過,列舉本身應為常量

season s;

s = 100; //c++中不可以通過

int a,b = 10;

(a = b) = 10; //表示式是不可以被賦值的 c中不可以 c++中可以

(a !=b?a:b) = 1000; // c中不可以 c++中可以

a = b =10; //c中可以 c++中不可以

兩者相同功能,但是前者為物件,後者為函式

char name[30];

scanf(「%s」, name);//不安全 容易越界導致崩潰

cin>>name; //流輸入運算子 針對鍵盤輸入流

cout<<」name =「 << name << endl; //先把name=流到cout裡,再把那麼流到cout裡,最後end1流到cout;

c中的命名空間

在c語言中只有乙個全域性作用域

c語言中所有的全域性標示符共享同乙個作用域

標示符可能衝突

c++中的命名空間

命名空間將全域性作用域分成不同的部分

不同空間中的標示符可以相同而不會發生衝突

命名空間可以相互巢狀

全域性作用域也叫預設命名空間

register關鍵字請求編譯器將區域性變數儲存於暫存器中

c語言中無法取得register變數位址

c++中可以取得register變數位址,且c++編譯器有自己的優化方式,不使用register也可能做優化

早期c語言編譯器不會對**進行優化,因此register對變數的宣告變得無效

c++編譯器發現程式中需要取register變數的位址時,register對變數的宣告變得無效

c語言的struct定義了一組變數的集合,c編譯器並不認為這是一種新的型別

c++中的struct是乙個新型別的定義宣告

c++中所有的變數和函式都必須有型別

c語言中的預設型別在c++中是不合法的

c語言中的const**變數**是唯讀變數,有自己的儲存空間

c++中的const**常量**,修飾的常量在編譯期間就確定下來

可能分配儲存空間,也可能不分配儲存空間

當const常量為全域性時,並且需要在其它檔案中使用,會分配儲存空間。

當使用&操作符取const常量的位址,會分配儲存空間

當const int &a = 10;const修飾引用時,也會分配儲存空間

const和#define的區別

c++中的const常量類似於巨集定義

const int c = 5; 類似 #define c 5

c++中的const常量與巨集定義不同

const常量是由編譯器處理的,提供型別檢查和作用域檢查

巨集定義由預處理器處理,單純的文字替換

1)引用在c++的內部實現是乙個常指標

type &name <–> type* const name

2)c++編譯器在編譯過程中使用常指標作為引用的內部實現,因此引用所占用的記憶體空間大小於指標相同

3)從使用的角度,引用會讓人誤認為其只是乙個別名,沒有自己的儲存空間,這是c++為了實用性而做出的細節隱藏

void fun(int &a )——–void fun(int *const a)

————————— }

4)仔細對比間接賦值成立的三個條件

定義兩個變數(乙個實參,乙個形參)

建立關聯,實參取位址傳遞給形參

*p去間接的修改實參的值

引用在實現上只不過是把間接賦值的後兩個條件合和二為一

(當實參傳給形參引用時,只不過是c++編譯器幫我們程式設計師手工取了乙個實參位址,傳給了形參引用(常量指標))

引用當左值(c++引用使用時的難點)

當函式返回值是引用時

若返回棧變數,不能成為其他引用的初始值,不能作為左值使用

若返回靜態變數或者全域性變數,可以成為其他引用的初始值,即可作為右值使用,也可作為左值使用

C回顧與C 概述

一 c回顧 1.變數 區域性變數 區域性變數是在函式中定義的臨時變數,作用域是從變數的定義處開始,到函式結尾。靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,但靜態區域性變數只對定義自己的函式體可見。外部變數 外部變數是在函式外部定義的全域性變數,作用...

C 回顧之函式

區域性靜態物件 第一次經過物件定義語句時初始化,之後不再執行初始化語句,直到程式終止物件才會被銷毀。給函式傳遞引數時盡量使用引用避免拷貝,同時如果函式無須改變引用形參的值,最好將其宣告為常量引用,這很重要,能夠避免很多錯誤。頂層const和底層const。頂層const是指標本身是const不可改變...

C 回顧之順序容器

順序容器型別 vector deque 雙端佇列,也可快速隨機訪問 list 雙向鍊錶 forward list 單向鍊錶 array 比內建陣列更安全 string string 和 vector 都是將元素儲存在連續的記憶體空間。快速隨機訪問,但插入刪除就很慢。應該使用標準庫容器,而不是原始的資...