標籤: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