第二章 資料,變數和計算

來源:互聯網
上載者:User

標籤:c++學習筆記 資料 變數 計算

標頭檔

#include <>或#include ""

<>

強制類型轉換

double a=1.6;

cout<<static_cast<int>(a)<<endl;

輸出為1

注意舊的強制類型轉換為int(a),這比新的更容易出錯,得不到想要的結果,所以推薦static_cast<轉換成的類型>()

自動判斷資料類型

auto n=16;

自動判斷n的類型為int

const auto e=1.1;

自動判斷靜態常數e的類型為double

查看資料類型

#include <typeinfo>

double a=1.1; float b=2.2f;

cout<<typeid(a*b).name()<<endl;

輸出為double

按位元運算符

& 按位與    | 按位或       ^ 按位異或    ~ 按位取反    >>右移     <<左移

屏蔽高四位:

char letter=‘A‘;

letter &=0x0F;

在佔用中間儲存空間的情況下交換兩個整數:

char a=‘a‘,b=‘b‘;

a=a^b;

b=a^b;

a=a^b;

結果a=‘b‘,b=‘a‘

移位:

int a=40;

cout<<(a<<2)<<(a>>2)<<endl;

結果:160 10

注意精度損失和符號位會保留

lvalue和rvalue

lvalue:記憶體中持續儲存資料的一個地址,因為lvalue的運算式都可以放在“=”左邊,所以叫lvalue

rvalue:臨時儲存的運算式結果

a=b+c;       //b+c的結果臨時存在記憶體中,並複製給a,然後丟棄,所以b+c為rvalue

++a;       //結果為遞增之後的a,所以為lvalue

a++;      //將a的值臨時儲存為運算式,然後才遞增a,所以為rvalue

儲存時間和範圍

範圍:可以訪問該變數的程式碼域

儲存時間:建立到銷毀變數,釋放佔用空間的期間

1.自動儲存時間:具有局部範圍或者代碼塊範圍,空間在記憶體棧中自動分配,如果沒有初始化那麼將為當前分配到記憶體空間的無用值

2.靜態儲存時間:如全域變數(在main函數之前聲明,如未賦予初值則為0),如果因為局部變數而被隱藏,可以使用如::a顯示全域變數而不管被隱藏多深

3.動態儲存裝置時間

靜態變數:在一個代碼塊內聲明,並且只能在代碼塊內部使用它,但是在程式生存期內持續存在,如果沒有賦予初值則為0

名稱空間

用於防止將相同的名稱用於不同的函數,即防止意外的名稱衝突

ISO/IEC C++標準庫中使用的所有名稱都在std名稱空間中定義

using聲明:using std::cout,這樣之後的cout就相當於std::cout

using指令:using namespace std,將來自std名稱空間的所有名稱匯入源檔案,使用標準庫的名稱都不用打std,但是也否定了使用名稱空間的主要原因——防止意外的名稱衝突

聲明名稱空間:namespace 名稱空間名{變數或者函數},調用為名稱空間::變數或者函數,main()不能放在名稱空間中

C++/CLI編程

一種基本類型是值類類型,既可以表現為普通的值,也可以在環境需要時表現為對象

封箱:編譯器安排從原值到關聯的值類類型對象的自動轉換

拆箱:和封箱相反

ISO/IEC C++基本類型名稱是C++/CLI程式中實值型別名稱的別名,所以可以使用(比如bool為System::Boolen的別名,int為System::Int32的別名)

在ISO/IEC C++中,基本類型和類類型完全不同,但是C++/CLI中,所有資料都是作為類類型的對象儲存的,或者作為值類類型,或者作為引用類類型

main(array<System::String ^> ^args)的()中的內容作用是從命令列啟動程式的執行時把值傳遞到函數main()

格式化輸出:

System::Int32 a = 1;

double b=1.2;

Console::WriteLine(L"a is {0},b is {1,-6:F2}",a,b);

結果:a is 1,b is   1.20

Console::WriteLine(L"a is {0},b is {1,-6:F2}",a,b);等同於Console::Write(L"a is ");Console::Write(a);Console::Write(L",b is   ");Console::Write(b);

L表明這是一個寬字元串,每個字元張兩個位元組

{n,w:Axx}

1.n為參數的位置,這裡a為參數0,b為參數1

2.w為可選的欄位寬度規範,正數為靠右對齊,負數為靠左對齊,如果顯示欄位小於規定寬度則用空格補全,如果大於則忽略欄位寬度規範

3.A規定如何對值進行格式化,這裡F為規定精度

4.xx為可選的一個或兩個數字

WriteLine()和Write()都是Console類的函數,唯一的區別就是WriteLine()最後有一個預設的換行

A:

D或d 輸出整數時如果精度大於位元則在左邊填充0

E或e 科學計數法輸出,精度為小數位

F或f 浮點數輸出,精度為小數位

讀取:

String^ line=Console::ReadLine();

char ch=Console::Read();

ConsoleKeyInfo keypress=Console::ReadKey(true);

註:Console::ReadKey()函數把按下的鍵作為ConsoleKeyInfo類型的對象返回,其中keypress.KeyChar儲存返回的值,true表示按下的內容不再螢幕顯示,而預設或者false則顯示;列印:

Console::WriteLine(L"you enter {0}",keypress.KeyChar);

int value=Int32::Parse(Console::ReadLine());

註:Console::ReadLine()函數返回的字串被作為參數傳遞給Int32類的Parse()函數,Parse()將字串轉換為32位整數,如果要轉換為double則用Double::Parse()

強制轉換:

double a=1.2;

double b=2.7;

int c= safe_cast<int>(a)+safe_cast<int>(b);

註:safe_cast和本地C++編程的static_cast用法一樣

枚舉:

enum class Fruit{Apple=1,Banana,Orange};

Fruit fruit=Fruit::Apple;

Console::WriteLine(L"Fruit is {0} and the value is {1}",fruit,safe_cast<int>(fruit));

結果:Fruit is Apple and the value is 1

註:C++/CLI枚舉是一種類類型,Fruit相當於類,Apple和Banana相當於類的對象而不是ISO/IEC C++中那樣只是基本類型的值,因此C++/CLI的枚舉不能放在函數中,必須全域(在main之前)  

::為範圍運算子,表示Apple和Banana在Fruit範圍內

如果沒給枚舉對象賦值那麼第一個預設為0,也可以給枚舉對象賦其它類型的值,比如bool,long,short

枚舉的運算:

Fruit fruit1=Fruit::Apple;

Fruit fruit2=Fruit::Orange;

Fruit fruit3=fruit2-fruit1;

Fruit fruit4=fruit2-safe_cast<Fruit>(fruit1);

Fruit fruit5=fruit2-Fruit::Apple;

Console::WriteLine(L"fruit3 is {0},fruit4 is {1},fruit5 is {2}",fruit3,fruit4,fruit5);

註:如fruit6=fruit2-2;為錯誤,因為沒有自動轉換

枚舉作為標誌:

[Flags] enum class Flag{Read=1,Write=2,Execute=4,None=8};

Flag statue=Flag::Read | Flag::Write | Flag::Execute;

//statue變數的值為0000 0000 0000 0000 0000 0000 0000 1011

Console::WriteLine(L"statue is {0}",statue);

statue=statue & ~Flag::Write;

//statue變數的值為0000 0000 0000 0000 0000 0000 0000 1001

Console::WriteLine(L"statue is {0}",statue);

結果:

statue is Read Write Execute

statue is Read Execute

註:statue=statue & Flag::Write不能寫成statue &=Flag::Write;可以在C++/CLI使用和本地C++相同的枚舉,但是不推薦

查看類型:

int a=5;

double b=2.3;

Console::WriteLine(L"Type of a*b is {0}",(a*b).GetType());

結果:Type of a*b is System.Double

註:本地C++的typeid操作不能用在C++/CLI中;(a*b).GetType()會產生一個System::Type的一個對象,輸出的時候會自動轉換為System::String的對象


本文出自 “flyclc” 部落格,請務必保留此出處http://flyclc.blog.51cto.com/1385758/1540143

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.