1. 程式人生 > >C++ Primer 【第四版】第二章 變數和基本型別

C++ Primer 【第四版】第二章 變數和基本型別

習題2.1

intlong short 型別之間有什麼差別?

【解答】

它們的最小儲存空間不同,分別為16 位、32 位和16 位。一般而言,short 型別為半個機器字(word)長,int 型別為一個機器字長,而long 型別為一個或兩個機器字長(在32 位機器中,int 型別和long 型別的字長通常是相同的)。因此,它們的表示範圍不同。

習題2.2

unsignedsigned 型別有什麼差別?

【解答】

前者為無符號型別,只能表示大於或等於0 的數。後者為帶符號型別,可以表示正數、負數和0

習題2.3

如果在某機器上short 型別佔16 位,那麼可以賦給short

型別的最大數是什麼?unsigned short 型別的最大數又是什麼?

【解答】

若在某機器上short 型別佔16 位,那麼可以賦給short型別的最大數是215-1,即32767;而unsigned short 型別的最大數為216-1,即65535

習題2.4

當給16 位的unsigned short 物件賦值100000 時,賦的值是什麼?

【解答】

34464

100000超過了16 位的unsigned short 型別的表示範圍,編譯器對其二進位制表示擷取低16 位,相當於對65536 求餘(求模,%),得34464

習題2.5

float型別和double 型別有什麼差別?

【解答】

二者的儲存位數不同(一般而言,float 型別為32 個二進位制位,double型別為64 個二進位制位),因而取值範圍不同,精度也不同(float型別只能保證6 位有效數字,而double 型別至少能保證10 位有效數字)。

習題2.6

要計算抵押貸款的償還金額,利率、本金和付款額應分別選用哪種型別?解釋你選擇的理由。

【解答】

利率可以選擇float 型別,因為利率通常為百分之幾。一般只保留到小數點後兩位,所以6 位有效數字就足以表示了。本金可以選擇long 型別,因為本金通常為整數。long 型別可表示的最大整數一般為231-1(即2147483647),應該足以表示了。付款額一般為實數,可以選擇double

型別,因為float 型別的6 位有效數字可能不足以表示。

習題2.7

解釋下列字面值常量的不同之處。

(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

10int 型字面值,10u unsigned型字面值,10L long 型字面值,10uLunsigned long 型字面值,012 為八進位制表示的int 型字面值,0xC為十六進位制表示的int 型字面值。

(c)3.14,3.14f,3.14L

3.14double 型字面值,3.14f float型字面值,3.14L long double 型字面值。

習題2.8

確定下列字面值常量的型別:

(a)–10 (b) -10u (c) -10. (d) -10e-2

【解答】

(a)int

(b)unsigned int

(c)double

(d)double

習題2.9

下列哪些(如果有)是非法的?

(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_strlocal_str 的初始值均為空字串,global_int 的初始值為0local_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的值是100j 的賦值所使用到的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

rii 的引用,對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 選單項,在ConfigurationPropertiesC/C++GeneralWarningLevel 中可以選擇警告級別。

相關推薦

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# 第三版》)的詳細