C++ 內建的數字型別可分為整數與浮點數。
整數是不帶小數點的數字,例如0、691或-2。
浮點數是帶有小數點的數字,例如6.02214076、0.1或-1.616。
以下範例展示了四個不同變數的宣告與初始化:
int m_morales{9241}; // base 10: 0-9
int a_apaec{0x24CD}; // base 16: 0-9 and A-F
int m_gargan{0b10010000011001}; // base 2: 0-1
int b_reilly{022031}; // base 8: 0-7
// Leading with a 0 not the letter o.
當你把值指定給int變數時,可以直接使用字面值。
字面值就是像9241這樣寫死在程式裡的數字。
不同的進位表示法各有不同的整數字面值。
十進位整數字面值最常見,使用0到9的數字。
只要加上特殊的前綴,例如0x,就能使用其他進位。
上面的範例用四種表示法與前綴來呈現數字9241。
所有變數都初始化為相同的值。
如果想進一步了解各種表示法系統,可以參考這份小教學。
你可以用單引號分隔數字,讓程式碼更容易閱讀。
9'241與0b0100'100'0001'1001或92'4'1相同。
浮點數字面值有兩種形式。
除了直覺的0.0024,也可以使用它的科學記號2.4e-3。
最常見的浮點數型別是double。
C++ 支援+、-、*、/、(、)與%來組成運算式。
兩個整數運算的結果仍然是整數。
5 / 2會回傳2。
當其中一個運算型別是浮點數時,結果也會是浮點數。
5.0 / 2與5 / 2.0會回傳2.5。
%是餘數運算子,會回傳整數除法的餘數:5%3的結果是2。
賦值運算子會把字面值指定給變數。 賦值一律由右至左進行,絕不會反過來。
int length = 5;
int width = 2;
length = width;
這裡整數值5被指定給變數length。
接著整數值2被指定給變數width。
最後,width的值被複製到變數length,原本的值5就遺失了。
另外要注意,我們只在賦值運算發生的當下,把width的值指定給length。
因此,如果之後width的值改變了,也不會影響length取得的值。
賦值運算子可以與其他運算子(算術與位元運算)結合,這類運算子稱為compound assignment運算子:+=、-=、*=、/=、%=。
這些運算子會對變數執行運算,藉此修改變數目前的值。
// we start with 0 people
int people{};
// we need 0 eggs
int eggs{};
// two people joined:
people += 2;
// people is now 2
// let's add 3 eggs per person
eggs += 3 * people;
// eggs is now 6
變數people與eggs都初始化為0。
接著,我們在變數people現有的值0加上整數值2,再把結果指定回people。
現在people變成2。
之後,我們為每個人加上3顆蛋,總共是6顆蛋。
現在把這個6加到變數eggs現有的值0上,再指定回eggs。
eggs現在會是6。
等效的運算式會是people = people + 2與eggs = eggs + (3 * people)。
在這個練習中,你將撰寫程式碼,幫助一位自由工作者與專案經理溝通。 你的任務是提供幾個工具函式,用來快速計算日費率與月費率,並可選擇套用指定的折扣。
我們先在自由工作者與專案經理之間訂下一些規則:
有時候,自由工作者會想在日費率上套用折扣(例如給最忠實的客戶或非營利組織客戶)。
折扣以代表百分比的分數來表示,例如 25.0(25%)。
實作一個名為 daily_rate 的函式,根據作為參數傳入的時薪計算日費率。
契約定義中,一天有 8 個可計費小時。
daily_rate(60)
// => 480.0
回傳的日費率型別應為 double。
實作一個 apply_discount 函式,計算折扣後的價格。
它應接受 2 個參數:原始價格與折扣百分比。
apply_discount(150, 10)
// => 135.0
回傳值一律應為 double 型別,且不得以任何方式四捨五入。
實作一個 monthly_rate 函式,計算折扣後的月費率。
它應有 2 個參數:時薪與折扣百分比。
monthly_rate(77, 10.5)
// => 12130
回傳的月費率應向上取整(取天花板值),取到最接近的整數。
實作一個 days_in_budget 函式,接受預算、時薪與折扣,並計算這樣能涵蓋多少個完整的工作天。
days_in_budget(20'000, 80, 11.0)
// => 35
回傳的天數應向下取整(取地板值),取到最接近的整數。