亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++變量和基本類型詳解

 更新時間:2021年10月12日 09:59:11   作者:Binary_of  
這篇文章主要介紹了C++變量和基本類型,,一定要注意局部變量與全局變量的作用范圍,需要的朋友可以參考下,希望能夠給你帶來幫助

基本內(nèi)置類型

算術類型分為兩類:整型(包括字符和布爾類型在內(nèi))和浮點型

1. 不同平臺下基本類型的字節(jié)數(shù)

類型 16位平臺 32位平臺 64位平臺
char 1 1 1
short 2 2 2
int 2 4 4
long 4 4 8
long long / 8 8
指針 2 4 8
float 4 4 4
double 8 8 8

數(shù)據(jù)類型long long 是在C++11中新定義的。

2. 算數(shù)類型的最小尺寸

算術類型分為兩類:整型(包括字符和布爾類型在內(nèi))和浮點型

類型 含義 最小尺寸
bool 布爾類型 未定義
char 字符 8位
wchar_t 寬字符 16位
char16_t Unicode字符 16位
char32_t Unicode字符 32位
short 短整型 16位
int 整型 16位
long 長整型 32位
long long 長整型 64位
float 單精度浮點數(shù) 6位有效數(shù)字
double 雙精度浮點數(shù) 10位有效數(shù)字
long double 擴展雙精度浮點數(shù) 10位有效數(shù)字

3. 數(shù)據(jù)類型選擇的經(jīng)驗準則

  • 當知曉數(shù)值不可能為負時,選用無符號類型
  • 使用int執(zhí)行整數(shù)運算,short常常太小,long和int一般尺寸一樣。如果int不夠,用long long。
  • 在算數(shù)表達式中不要使用char或bool,使用char特別容易出問題。如果要使用一個不大的整數(shù),那么明確執(zhí)行為signed char或unsigned char。
  • 執(zhí)行浮點數(shù)運算用double,float通常進度不夠而且兩者計算代價相差無幾。Long double一般沒有必要,且消耗不容忽視。

4. 有符號類型和無符號類型

  • 無符號類型賦值超出其范圍,結果是取模后的值。如unsigned char c = -1; //假設char占8bit,c的值為255
  • 有符號類型賦值超出其范圍,結果未定義。如signed char c2 = 256; //假設char占8bit,c2的值未定義
  • 切勿混用帶符號類型和無符號類型。
  • 算數(shù)表達式中既有無符號數(shù)又有帶符號數(shù),帶符號的數(shù)會轉(zhuǎn)換成無符號的數(shù) 

5.初始化與賦值

初始化和賦值是兩個完全不同的操作。

  • 定義于任何函數(shù)體外的之外的變量被初始化成0
  • 定義于函數(shù)體(塊作用域)內(nèi)的內(nèi)置類型的對象如果沒有初始化,則其值未定義。養(yǎng)成初始化內(nèi)置變量的習慣。
  • 類的對象如果沒有顯式地初始化,則其值由類確定。

6. 聲明與定義

  • 聲明使得一個名字為程序所知,定義會申請存儲空間,還可能為其賦初始值
  • (分離式編譯) 如果想聲明一個變量而非定義它,就在變量名前添加關鍵字extern,而且不要顯式地初始化變量
  • 對于復雜的聲明語句,可以從變量名從右往左理解
  • 變量能且只能被定義一次,但是可以被多次聲明 

7. C++關鍵字

8. const

8.1 初始化

默認狀態(tài)下,const對象僅在文件內(nèi)有效。

在編譯的過程中,編譯器會把所有用到該const變量的地方都替換成相應的值。所以編譯器必須知道變量的初始值,如果存在多個文件的情況下,每個文件必須知道const的初始值(const對象也必須初始化)。但由于默認狀態(tài)下,const對象僅在文件內(nèi)有效,當多個文件同時出現(xiàn)同名的const變量時,其實就相當于分別定義了不同的變量。

如果想只定義一次怎么做呢?

只需要無論是聲明還是定義都標記extern關鍵字即可。

//file1.cpp
extern const i=1;
//file2.cpp
extern const i;

如果想要在多個文件之間共享const 對象,必須在變量之前添加extern關鍵字

8.2 const引用

定義:把引用綁定到const對象上,即為對常量的引用(reference to const)。
引用類型必須與其所引用對象類型一致(但是有兩個例外),

8.2.1 與普通引用不同的是不能讓非常量引用指向一個常量變量。

    int i= 0;
    const int &ci = i; 
    int &ri = ci;

在這里插入圖片描述

因為非常量引用可以修改它所綁定的對象,但是常量引用不能,如果非常量引用指向一個常量變量合理的話,那么非常量引用可以修改它所綁定的對象的值,這顯然是不正確的。

8.2.2 初始化常量引用時允許將以任意表達式作為初始值,只要表達式的結果能轉(zhuǎn)換成對應類型即可。

8.2.2.1允許常量引用綁定分常量的對象、字面值,甚至一個一般表達式

    double dval = 3.14;
    const int &ri = dval;
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

編譯器會將上面代碼變成:

    const int temp= dval;
    const int &ri = temp;
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

在這種情況下面,ri綁定了一個臨時量

ri不是常量引用的時候會發(fā)生錯誤:

    double dval = 3.14;
    int &ri = dval; // error: invalid initialization of non-const reference of type ‘int&' from an rvalue of type ‘int'
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

編譯器會將上面代碼變成:

    int temp= dval;
    int &ri = temp;
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

由于臨時值的特殊性,程序員并不能操作臨時值,而且臨時值隨時可能被釋放掉,所以,一般說來,修改一個臨時值是毫無意義的,據(jù)此,c++編譯器加入了臨時值不能作為非const引用的這個語義限制。

8.2.2.2 const引用可能用一個非const對象

    int i =0;
    int &ri = i;
    const int &ci = i;
    ci = 2; // error: assignment of read-only reference ‘ci'

常量引用僅對引用可參與的操作做出限定,對于引用的對象本身是不是一個長量未作限定

8.3 const與指針

指針的類型必須與其所指對象的類型一致(但是有兩個例外)

允許一個指向常量的指針指向一個非常量對象.

和const引用差不多,指針常量的指針也沒有規(guī)定所指的對象必須是一個常量

8.3.1 指向常量的指針和常量指針

指向常量的指針(指針可以改變,指針的值不可變):

const int x=1;
const int *p = &x;//p為指向常量x的指針
int *p = &x; //錯誤,因為p只是個普通指針

常量指針(不變的指針而不是指針指向的值):

int x=0;
int *const p = &x;//p為常量指針(允許一個指向常量的指針指向一個非常量對象.)
const int xx=0;
const int *const pp= &xx;//pp為指向常量的常量指針(
    int x=0;
    int y = 11;
    const int *p = &x;//p為常量指針(允許一個指向常量的指針指向一個非常量對象.)
    int  *const cp = &x;
    const int *const pp= &x;//pp為指向常量的常量指針

    x = 1;
    std::cout<<"x:"<<x<<std::endl;
    std::cout<<"*p:"<<*p<<std::endl;
    std::cout<<"*cp:"<<*cp<<std::endl;
    std::cout<<"*PP:"<<*pp<<std::endl;
    p = &y;
    *p = 11; // error: assignment of read-only location ‘* p'
    *cp = 12;
     cp = &y;// error: assignment of read-only variable ‘cp'
    std::cout<<"*p:"<<*p<<std::endl;
    std::cout<<"*cp:"<<*cp<<std::endl;

小結:

常量指針,指針本身是一個常量,不可以改變指向的對象,但是可以改變指向?qū)ο蟮闹?可以使用解引符改變地址所指向的值
指向常量的指針,可以重新指定指向新的對象,但是不可以改變對象的值.

    int errNumb =0;
    int *const curErr = &errNumb; // curerr 將一直指向errNumb errNumb 的值變化了curerr的值也跟著變化
    const double pi = 3.14159;
    const double *const pip = &pi; // pip 是一個指向常量對象的常量指針
    std::cout<<"curErr:"<<*curErr<<std::endl;
    std::cout<<"pip:"<<*pip<<std::endl;
    errNumb =1;
    std::cout<<"curErr:"<<*curErr<<std::endl;

輸出:

curErr:0

pip:3.14159

8.3.2 頂層const和底層const

指針如果添加const修飾符時有兩種情況:

頂層const:表示指針本身是一個常量
底層const:表示指針所指向的對象是一個常量

9. constexpr 和常量表達式

常量表達式(const experssion):是指
1.值不會改變 并且
2.在編譯過程就能得到計算結果的表達式。

字面量屬于常量表達式,用常量表達式初始化的const對象也是常量表達式。

9. 1 constexpr 變量:

一般來說,如果 你認定變量是一個常量表達式,那就把它聲明成constexpr類型函數(shù):

constexpr函數(shù)是指能用于常量表達式的函數(shù)。

應遵循的約定:函數(shù)返回類型及所有形參的類型都是字面值類型,而且函數(shù)體中必須有且只有一條return 語句。

constexpr函數(shù)體內(nèi)可以有其他語句,只要這些語句在運行時不執(zhí)行任何操作。(例如,空語句、類型別名和using聲明等)

constexpr函數(shù)被隱式地指定為內(nèi)聯(lián)函數(shù)。

9. 2字面值類型

常量表達式的值需要在編譯時就得到計算,因此對聲明constexpr時用到的類型必須有所限制。因為這些類型一般比較簡單,值也顯而易見、容易得到,就把它們稱為“字面值類型”(literal type)。

字面值類型范圍:

算術類型、引用和指針都屬于字面值類型。某些類也是字面值類型,它們可能含有constexpr函數(shù)成員。自定義類Sales_item、IO庫、string類型不屬于字面值類型。

9. 3constexpr 和指針

盡管指針和引用可以定義成constexpr,但它們的初始值受到嚴格限制。一個constexpr指針的初始值必須是nullptr、0或存儲于某個固定地址中的對象。

constexpr int *q = nullprt 等價于 int const *q = nullprt

函數(shù)體內(nèi)定義的變量一般來說并非存放在固定地址中,因此constexpr指針不能指向這樣的變量。定義于函數(shù)體外的對象其地址固定不變,能用來初始化constexpr指針。

允許函數(shù)定義一類有效范圍超出函數(shù)本身的變量,如局部靜態(tài)變量,這類變量和定義在函數(shù)體之外的變量一樣有固定地址,因此constexpr引用能綁定到這樣的變量上,constexpr指針也能指向這樣的變量。

10. 處理類型

10.1 類型別名 typeof

typedef double a;
typedef wages base,*p; //等價于 double base ,*p;

using

using SI = Sales_item;
SI item;//等價于 Sales_item item;

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • C語言實現(xiàn)打印星號圖案

    C語言實現(xiàn)打印星號圖案

    這篇文章主要介紹了C語言實現(xiàn)打印星號圖案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 關于背包問題的一些理解和應用

    關于背包問題的一些理解和應用

    這篇文章主要介紹了關于背包問題的一些理解和應用,本文可以說是背包問題九講的補充、讀后感,需要的朋友可以參考下
    2014-08-08
  • 簡單談談C++中指針與引用的區(qū)別

    簡單談談C++中指針與引用的區(qū)別

    指針和引用在C++中很常用,但是對于它們之間的區(qū)別很多初學者都不是太熟悉,下面來談談他們2者之間的區(qū)別和用法
    2017-04-04
  • Opencv處理圖像之輪廓提取

    Opencv處理圖像之輪廓提取

    這篇文章主要為大家詳細介紹了Opencv處理圖像之輪廓提取,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 深入理解C語言sizeof()計算空間大小為8的問題

    深入理解C語言sizeof()計算空間大小為8的問題

    本文將介紹C語言中的sizeof()函數(shù),以及如何使用它來計算變量、數(shù)據(jù)類型和數(shù)組在內(nèi)存中的大小,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C語言中#pragma預處理指令的使用

    C語言中#pragma預處理指令的使用

    在所有的預處理指令中,#pragma指令可能是最復雜的了,它的作用是設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作,本文主要介紹了C語言中#pragma預處理指令的使用,感興趣的可以了解一下
    2023-12-12
  • 淺析VSCode launch.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等

    淺析VSCode launch.json中的各種替換變量的意思 ${workspaceFolder} ${file} $

    這篇文章主要介紹了VSCode launch.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等,非常不錯具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C語言 map函數(shù)的基礎用法詳解

    C語言 map函數(shù)的基礎用法詳解

    這篇文章主要為大家介紹了C語言 map函數(shù)的基礎用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++左值和右值學習筆記

    C++左值和右值學習筆記

    這篇文章主要為大家介紹了C++左值和右值學習筆記的重點講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • C標準庫<assert.h>的實現(xiàn)詳解

    C標準庫<assert.h>的實現(xiàn)詳解

    這篇文章主要介紹了C標準庫<assert.h>的實現(xiàn),主要包括了<assert.h>的基本概念、實現(xiàn)及用法等,需要的朋友可以參考下
    2014-09-09

最新評論