C++ Primer 【第四版】第二章 變數和基本型別
int、long 和short 型別之間有什麼差別?
【解答】
它們的最小儲存空間不同,分別為16 位、32 位和16 位。一般而言,short 型別為半個機器字(word)長,int 型別為一個機器字長,而long 型別為一個或兩個機器字長(在32 位機器中,int 型別和long 型別的字長通常是相同的)。因此,它們的表示範圍不同。
unsigned和signed 型別有什麼差別?
【解答】
前者為無符號型別,只能表示大於或等於0 的數。後者為帶符號型別,可以表示正數、負數和0。
如果在某機器上short
型別佔16 位,那麼可以賦給short
【解答】
若在某機器上short 型別佔16 位,那麼可以賦給short型別的最大數是215-1,即32767;而unsigned short 型別的最大數為216-1,即65535。
當給16 位的unsigned short 物件賦值100000 時,賦的值是什麼?
【解答】
34464。
100000超過了16 位的unsigned short 型別的表示範圍,編譯器對其二進位制表示擷取低16 位,相當於對65536 求餘(求模,%),得34464。
float型別和double 型別有什麼差別?
【解答】
二者的儲存位數不同(一般而言,float 型別為32 個二進位制位,double型別為64 個二進位制位),因而取值範圍不同,精度也不同(float型別只能保證6 位有效數字,而double 型別至少能保證10 位有效數字)。
要計算抵押貸款的償還金額,利率、本金和付款額應分別選用哪種型別?解釋你選擇的理由。
【解答】
利率可以選擇float
型別,因為利率通常為百分之幾。一般只保留到小數點後兩位,所以6 位有效數字就足以表示了。本金可以選擇long
型別,因為本金通常為整數。long 型別可表示的最大整數一般為231-1(即2147483647),應該足以表示了。付款額一般為實數,可以選擇double
解釋下列字面值常量的不同之處。
(a)'a',L'a',"a",L"a"
(b)10,10u,10L,10uL,012,0xC
(c)3.14,3.14f,3.14L
【解答】
(a)'a',L'a',"a",L"a"
'a'為char 型字面值,L'a'為wchar_t 型字面值,"a"為字串字面值,L"a"為寬字串字面值。
(b)10,10u,10L,10uL,012,0xC
10為int 型字面值,10u 為unsigned型字面值,10L 為long 型字面值,10uL為unsigned long 型字面值,012 為八進位制表示的int 型字面值,0xC為十六進位制表示的int 型字面值。
(c)3.14,3.14f,3.14L
3.14為double 型字面值,3.14f 為float型字面值,3.14L 為long double 型字面值。
確定下列字面值常量的型別:
(a)–10 (b) -10u (c) -10. (d) -10e-2
【解答】
(a)int 型
(b)unsigned int 型
(c)double 型
(d)double 型
下列哪些(如果有)是非法的?
(a)"Who goes with F\145rgus?\012"
(b)3.14e1L (c) "two" L"some"
(d)1024f (e) 3.14UL
(f)"multiple line
comment"
【解答】
(c) 非法。因為字串字面值與寬字串字面值的連線是未定義的。
(d)非法。因為整數1024 後面不能帶字尾f。
(e)非法。因為浮點字面值不能帶字尾U。
(f)非法。因為分兩行書寫的字串字面值必須在第一行的末尾加上反斜線。
使用轉義字元編寫一段程式,輸出2M,然後換行。修改程式,輸出2,跟著一
個製表符,然後是M,最後是換行符。
【解答】
輸出2M、然後換行的程式段:
//輸出"2M"和換行字元
std::cout<< "2M" << '\n';
修改後的程式段:
//輸出'2', '\t', 'M'和換行字元
std::cout<< '2' << '\t' << 'M' << '\n';
編寫程式,要求使用者輸入兩個數——底數(base)和指數(exponent),輸出
底數的指數次方的結果。
【解答】
#include<iostream>
intmain()
{
//區域性物件
intbase, exponent;
longresult=1;
//讀入底數(base)和指數(exponent)
std::cout<< "Enter base and exponent:" << std::endl;
std::cin>> base >> exponent;
if(exponent < 0) {
std::cout<< "Exponent can't be smaller than 0" << std::endl;
return-1;
}
if(exponent > 0) {
//計算底數的指數次方
for(int cnt = 1; cnt <= exponent; ++cnt)
result*= base;
}
std::cout<< base
<<" raised to the power of "
<<exponent << ": "
<<result << std::endl;
return0;
}
區分左值和右值,並舉例說明。
【解答】
左值(lvalue)就是變數的地址,或者是一個代表“物件在記憶體中的位置”的表示式。右值(rvalue)就是變數的值,見2.3.1 節。變數名出現在賦值運算子的左邊,就是一個左值;而出現在賦值運算子右邊的變數名或字面常量就是一個右值。
例如:
val1=val2/8
這裡的val1 是個左值,而val2 和8 都是右值。
舉出一個需要左值的例子。
【解答】
賦值運算子的左邊(被賦值的物件)需要左值,見習題2.12。
下面哪些(如果有)名字是非法的?更正每個非法的識別符號名字。
(a)int double = 3.14159; (b) char _;
(c)bool catch-22; (d) char 1_or_2 ='1';
(e)float Float = 3.14f;
【解答】
(a)double 是C++語言中的關鍵字,不能用作使用者識別符號,所以非法。此語句可改為:double dval= 3.14159;。
(c)名字catch-22 中包含在字母、數字和下劃線之外的字元“-”,所以非法。可將其改為:catch_22;。
(d)名字1_or_2 非法,因為識別符號必須以字母或下劃線開頭,不能以數字開頭。可將其改為:one_or_two;。
下面兩個定義是否不同?有何不同?
intmonth = 9, day = 7;
intmonth =09, day = 07;
如果上述定義有錯的話,那麼應該怎樣改正呢?
【解答】
這兩個定義不同。前者定義了兩個int 型變數,初值分別為9 和7;後者也定義了兩個int 型變數,其中day 被初始化為八進位制值7;而month 的初始化有錯:試圖將month初始化為八進位制值09,但八進位制數字範圍為0~7,所以出錯。可將第二個定義改為:int month =011, day = 07;
假設calc 是一個返回double 物件的函式。下面哪些是非法定義?改正所有的非法定義。
(a)int car = 1024, auto = 2048;
(b)int ival = ival;
(c)std::cin >> int input_value;
(d)double salary = wage = 9999.99;
(e)double calc = calc();
【解答】
(a)非法:auto 是關鍵字,不能用作變數名。使用另一變數名,如aut 即可更正。
(c)非法:>>運算子後面不能進行變數定義。改為:intinput_value;std::cin >> input_value;
(d)非法:同一定義語句中不同變數的初始化應分別進行。改為:double salary = 9999.99, wage = 9999.99;
注意,(b)雖然語法上沒有錯誤,但這個初始化沒有實際意義,ival 仍是未初始化的。
下列變數的初始值(如果有)是什麼?
std::stringglobal_str;
intglobal_int;
intmain()
{
intlocal_int;
std::stringlocal_str;
//...
return0;
}
【解答】
global_str和local_str 的初始值均為空字串,global_int 的初始值為0,local_int 沒有初始值。
解釋下列例子中name 的意義:
externstd::string name;
std::stringname("exercise 3.5a");
externstd::string name("exercise 3.5a");
【解答】
第一條語句是一個宣告,說明std::string 變數name 在程式的其他地方定義。
第二條語句是一個定義,定義了std::string 變數name,並將name 初始化為"exercise 3.5a"。
第三條語句也是一個定義,定義了std::string 變數name,並將name 初始化為"exercise 3.5a",但這個語句只能出現在函式外部(即,name 是一個全域性變數)。
下列程式中j 的值是多少?
inti = 42;
intmain()
{
inti = 100;
intj = i;
//...
}
【解答】
j的值是100。j 的賦值所使用到的i 應該是main 函式中定義的區域性變數i,因為區域性變數的定義會遮蔽全域性變數的定義。
下列程式段將會輸出什麼?
inti = 100, sum = 0;
for(int i = 0; i != 10; ++i)
sum+= i;
std::cout<< i << " " << sum << std::endl;
【解答】
輸出為:
10045
for語句中定義的變數i,其作用域僅限於for 語句內部。輸出的i 值是for 語句之前所定義的變數i 的值。
下列程式合法嗎?
intsum = 0;
for(int i = 0; i != 10; ++i)
sum+= i;
std::cout<< "Sum from 0 to " << i
<<" is " << sum << std::endl;
【解答】
不合法。因為變數i 具有語句作用域,只能在for 語句中使用,輸出語句中使用i 屬非法。
下列程式段雖然合法,但是風格很糟糕。有什麼問題呢?怎樣改善?
for(int i = 0; i < 100; ++i)
//process i
【解答】
問題主要在於使用了具體值100 作為迴圈上界:100 的意義在上下文中沒有體現出來,導致程式的可讀性差;若100 這個值在程式中出現多次,則當程式的需求發生變化(如將100 改變為200)時,對程式程式碼的修改複雜且易出錯,導致程式的可維護性差。改善方法:設定一個const變數(常量)取代100 作為迴圈上界使用,併為該變數選擇有意義的名字。
下列哪些語句合法?對於那些不合法的使用,解釋原因。
(a)const int buf;
(b)int cnt = 0;
constint sz = cnt;
(c)cnt++; sz++;
【解答】
(a)不合法。因為定義const 變數(常量)時必須進行初始化,而buf 沒有初始化。
(b)合法。
(c)不合法。因為修改了const 變數sz 的值。
下列哪些定義是非法的?為什麼?如何改正?
(a)int ival = 1.01; (b) int &rval1 = 1.01;
(c)int &rval2 = ival; (d) const int &rval3 = 1;
【解答】
(b)非法。因為rval1是一個非const 引用,非const 引用不能繫結到右值,而1.01 是一個右值。可改正為:int &rval1 = ival;(假設ival 是一個已定義的int 變數)。
在習題2.24 給出的定義下,下列哪些賦值是非法的?如果賦值合法,解釋賦值的作用。
(a)rval2 = 3.14159; (b) rval2 = rval3;
(c)ival = rval3; (d) rval3 = ival;
【解答】
(d)非法。因為rval3是一個const 引用,不能進行賦值。合法賦值的作用:
(a)將一個double型字面值賦給int 型變數ival,發生隱式型別轉換,ival 得到的值為3。
(b)將int 值1 賦給變數ival。
(c)將int 值1 賦給變數ival。
(a)中的定義和(b)中的賦值存在哪些不同?哪些是非法的?
(a)int ival = 0; (b) ival = ri;
constint &ri = 0; ri = ival;
【解答】
intival = 0; 定義ival 為int 變數,並將其初始化為0。
constint &ri = 0; 定義ri 為const 引用,並將其繫結到右值0。
ival= ri; 將0 值賦給ival。
ri= ival; 試圖對ri 賦值,這是非法的,因為ri 是const引用,不能賦值。
下列程式碼輸出什麼?
inti, &ri = i;
i= 5; ri =10;
std::cout<< i << " " << ri << std::endl;
【解答】
輸出:
1010
ri是i 的引用,對ri 進行賦值,實際上相當於對i 進行賦值,所以輸出i 和ri 的值均為10。
編譯以下程式,確定你的編譯器是否會警告遺漏了類定義後面的分號。
classFoo {
//empty
}// Note: no semicolon
intmain()
{
return0;
}
如果編譯器的診斷結果難以理解,記住這些資訊以備後用。
【解答】
在筆者所用的編譯器中編譯上述程式,編譯器會給出如下錯誤資訊:
errorC2628: 'Foo' followed by 'int' is illegal (did you forget a ';'?)(第4 行)
warningC4326: return type of 'main' should be 'int or void' instead of'Foo' (第5 行)
errorC2440: 'return' : cannot convert from 'int' to 'Foo' (第6 行)
也就是說,該編譯器會對遺漏了類定義後面的分號給出提示。
區分類中的public 部分和private 部分。
【解答】
類中public 部分定義的成員在程式的任何部分都可以訪問。通常在public 部分放置操作,以便程式中的其他部分可以執行這些操作。類中private 部分定義的成員只能被作為類的組成部分的程式碼(以及該類的友元)訪問。通常在private部分放置資料,以對物件的內部資料進行隱藏。
定義表示下列型別的類的資料成員:
(a)電話號碼(b)地址
(c)員工或公司(d)網裡面的文章
【解答】
(a)電話號碼
classTel_number {
public:
//...物件上的操作
private:
std::stringcountry_number;
std::stringcity_number;
std::stringphone_number;
};
(b)地址
classAddress {
public:
//...物件上的操作
private:
std::stringcountry;
std::stringcity;
std::stringstreet;
std::stringnumber;
};
(c)員工或公司
classEmployee {
public:
//...物件上的操作
private:
std::stringID;
std::stringname;
charsex;
Addressaddr;
Tel_numbertel;
};
classCompany {
public:
//...物件上的操作
private:
std::stringname;
Addressaddr;
Tel_numbertel;
};
(d)某大學的學生
classStudent {
public:
//...物件上的操作
private:
std::stringID;
std::stringname;
charsex;
std::stringdept; // 所在系
std::stringmajor;
Addresshome_addr;
Tel_numbertel;
};
注意,在不同的具體應用中,類的設計會有所不同,這裡給出的只是一般性的簡單例子。
判別下列語句哪些是宣告,哪些是定義,請解釋原因。
(a)extern int ix = 1024 ;
(b)int iy ;
(c)extern int iz ;
(d)extern const int &ri ;
【解答】
(a)是定義,因為extern宣告進行了初始化。
(b)是定義,變數定義的常規形式。
(c)是宣告,extern宣告的常規形式。
(d)是宣告,聲明瞭一個const 引用。
下列宣告和定義哪些應該放在標頭檔案中?哪些應該放在原始檔中?請解釋原因。
(a)int var ;
(b)const double pi = 3.1416;
(c)extern int total = 255 ;
(d)const double sq2 = squt (2.0) ;
【解答】
(a)、(c)、(d)應放在原始檔中,因為(a)和(c)是變數定義,定義通常應放在原始檔中。(d)中的const 變數sq2 不是用常量表達式初始化的,所以也應該放在原始檔中。
(b)中的const變數pi 是用常量表達式初始化的,應該放在標頭檔案中。參見2.9.1節。
確定你的編譯器提供了哪些提高警告級別的選項。使用這些選項重新編譯以前選擇的程式,檢視是否會報告新的問題。
【解答】
在筆者所用的編譯器(Microsoft Visual C++ .NET 2003)中,在Project 選單中選擇Properties 選單項,在ConfigurationProperties→C/C++→General→WarningLevel 中可以選擇警告級別。
相關推薦
C++ Primer 【第四版】第二章 變數和基本型別
習題2.1 int、long 和short 型別之間有什麼差別? 【解答】 它們的最小儲存空間不同,分別為16 位、32 位和16 位。一般而言,short 型別為半個機器字(word)長,int 型別為一個機器字長,而long 型別為一個或兩個機器字長(在32 位機器
C++ Primer中文版(第五版)--第二章 變數和基本型別
資料型別是程式的基礎,它告訴我們資料的意義以及我們能在資料上執行的操作 C++定義了幾種基本內建型別:字元、整型、浮點數等,同時程式設計師可以自定義資料型別,另外C++ 標準庫還定義了一些更加複雜的資料型別,如可變長字串和向量。 2.1 基本內建型別
C++ Primer 【第四版】第三章 標準庫型別
預設建構函式(default constructor)就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有形參提供預設實參的建構函式定義。如果定義某個類的變數時沒有提供初始化式,就會使用預設建構函式。如果使用者定義的類中沒有顯式定義任何建構函式,編譯器就會自動為該類生成預設建構函式,
c++ primer 第五版學習筆記-第二章 變數和基本型別
本文為轉載,出處:https://blog.csdn.net/libin1105/article/details/48157115 https://blog.csdn.net/sunhero2010/article/d
C++Primer第五版 習題答案 第二章 變數和基本型別(variables and basic types)
2.1 C++語言規定一個int至少和一個short一樣大,一個long至少和一個int一樣大,一個long long至少和一個long一樣大。每個的最小尺寸分別為:short,16位;int,16位;long,32位;long long,64位。 除去布林
c++primer第二章變數和基本型別
2.1 基本內建型別 2.1.1算術型別 算術型別分兩類:整型(integral type)和浮點型。 算術型別的尺寸在不同機器上有所差別。某一類所佔的位元數不同,它所能表示的資料範圍也不樣。 型別 最小尺寸
《C++ Primer》讀書筆記-第二章 變數和基本型別
第一篇文章寫完後收到了很多同學的後臺留言,有鼓勵的,也有提出建議的,還有說錯別字的,每一條都一一回復了,當然提出建議的大都是說排版問題,現在已經換到MarkDown編輯器了,大家湊合著看就行了,肯定不影響閱讀了,至於錯別字的,哈哈,你懂就行。 &nbs
總結:《C++ primer》中文版——第二章 變數和基本型別
2.1.基本資料型別:整型(boolean,char,int)浮點型(float(6位小數),double(10位小數),long double(10位小數)),void(1.表示函式或過程無返回值;2.構造萬能指標型別void*,表示指向型別不限或型別不可預知的物件。) float(一個字4位元組),do
C++ Primer 第二章 變數和基本型別 筆記
第二章 變數和基本型別 筆記 2.1 基本內建型別 ——C++定義了一組整數、浮點數、單個字元和布林值的算術型別,另外還定義了一種稱為void的特殊型別。void型別沒有對應的值,僅用在有有限的一些
c++ primer 筆記第二章變數和基本型別(二)
2.4 const限定符 const定義的變數不能改變,因此const變數必須初始化。可以使用表示式初始化。 預設狀態下const物件僅在檔案內有效。 可以在宣告和定義都加extern。 練習2.26 (a) 不合法,未初始化 (b) 合法 (c) 合法 (d) 不合
C++ primer學習筆記——第二章 變數和基本型別
一、基本內建型別 C++基本內建型別包括算術型別和空型別。 1.算術型別 算術型別分為兩類:整形(包括字元和布林型在內)和浮點型 bool(布林型) 長度(位元組):1 取值範圍:false,true
第二章 變數和基本型別
算數型別 bool char wchar_t char16_t char32_t short int long long long float double long double 除去布林型和擴充套件字元型之外,其他整形可以劃分為帶符號(signed)和無符號
【C Primer Plus 第六版】筆記
1. 使用const 代替 #define 定義常量 原因:(1)const 宣告顯示指明瞭型別;(2)const可以很方便的用於複合型別,比如是陣列等;(3)作用域規則,const可以建立為全域性,名稱空間以及資料塊的常量。 2. 使用inline而不是#define
Thinking in Java(第四版)—— 第二章 一切皆對象
ati 靜態 數據類型 thinking short str 變量 屬於 字符 一.對象保存的位置 寄存器(cpu) 棧(變量) 堆(對象) 靜態域(static) 常量池(string) 非內存區池 二.基本數據類型 整數型 byte short int
『Java編程思想-第四版』第二章:一切都是對象
ack 運行時錯誤 存儲 數據類型 自身 創建 引用 all 外觀 Java編程思想-第四版學習總結,此為第二章:一切都是對象. package com.w3cjava.second; @SuppressWarnings("all") pu
JAVA 程式設計題解與上機指導(第四版) 第二章·識別符號、關鍵字和資料型別 2.12
/*2.12 設計實現一個MyGraphic類及子類,它們代表一些基本圖形,這些圖形包括矩形、三角形、圓、橢圓、菱形、梯形等。 試給能描述這些圖形所必需的屬性及必要的方法 **/ public class MyGraphic { String lineColor;//線條顏色 Strin
學習筆記之湯小丹《計算機作業系統第四版》----第二章 程序的描述與控制
前趨圖:起始結點,終止結點,重量(終止時間) 順序執行特徵:順序性、封閉性、可再現性 程式間可併發執行,只要程式間不存在前趨關係。如 其中,s1: a = x + 2; s2: b = y + 4; s3:c = a + b; s4:d = c + b 因
c++ primer 第2章 變數和基本型別
幾個小問題: (1)c++語言是什麼時候檢查資料型別的?(這麼提問好像不合適,但是又不知道怎麼表達,先這樣吧) 一些語言,如smalltalk和python等,是在程式執行的時候檢查資料型別的;與之相反,c++是一種靜態資料型別語言,它的型別檢查發生在編譯時。 (2)i
C++Primer學習:第2章 變數和基本型別
第2章 變數和基本型別2.1 基本內建型別2.2 字面值常量2.3 變數2.4 const限定符2.5 引用2.6 typedef 名字2.7 列舉2.8 類型別2.9 編寫自己的標頭檔案 2.1 基本內建型別2.1.1 字元型別: char 和 wchar_t , char
【C# in depth 第三版】溫故而知新(1) (轉)
64位 icm stringbu 值傳遞 關於 ota 現在 函數變量 出發 聲明 本文歡迎轉載,原文地址:http://www.cnblogs.com/DjlNet/p/7192354.html 前言 關於這本書(《深入理解C# 第三版》)的詳細