第2章演習
環境:CLion + MinGWの
2.1 int型、長い間の違いは何で、長い長いと短いことがありますか?符号なしと符号付きの型の違いは何ですか?floatとdoubleの違いは何ですか?
長い長い長(1)、INT、および短い整数が大きく、長い長い限り少なくとも同じ大きさとして少なくとも大と短い、長いintとして少なくともC ++、INTに規定されています
Win64のPC環境にCLion +にMinGW64 + GCC8.1.0は、次のプログラムを実行しました
cout<<"Size of short is "<<sizeof(short)<<" bytes."<<endl;
cout<<"Size of int is "<<sizeof(int)<<" bytes."<<endl;
cout<<"Size of long is "<<sizeof(long)<<" bytes."<<endl;
cout<<"Size of long long is "<<sizeof(long long)<<" bytes."<<endl;
結果
Size of short is 2 bytes.
Size of int is 4 bytes.
Size of long is 4 bytes.
Size of long long is 8 bytes.
(2)unsigned型のみ非負を表すことができ、何ら符号ビットが存在しない、署名されたタイプは、正、負、ゼロを表すことができ、最上位ビットは符号ビットであります
(3)単精度浮動小数点フロート、倍精度浮動小数点数は倍増します
Win64のPC環境にCLion +にMinGW64 + GCC8.1.0は、次のプログラムを実行しました
cout<<"Size of float is "<<sizeof(float)<<" bytes."<<endl;
cout<<"Size of double is "<<sizeof(double)<<" bytes."<<endl;
cout<<"Size of long double is "<<sizeof(long double)<<" bytes."<<endl;
結果
Size of float is 4 bytes.
Size of double is 8 bytes.
Size of long double is 16 bytes.
金利や元本の支払いのための2.2計算の住宅ローンは、データの種類を選択しなければならない何ですか?あなたの理由
二重選択し、通常の状況、倍精度むしろフロートより高い計算コスト、長い倍精度より高い計算コストが、より大きな下
2.3読むプログラム書か結果
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std:endl; // 32
std::cout << u - u2 << std:endl; // 2^32 - 32
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; // 32
std::cout << i - i2 << std::endl; // -32
std::cout << i - u << std::endl; // 0
std::cout << u - i << std::endl; // 0
// 补充
std::cout << u - i2 << std::endl; // 2^32 - 32, 混用带符号数和无符号数, 带符号数转换为无符号数
上記2.4
2.5リテラルデータ・タイプの下に示され、いくつかのリテラルの各グループ内の差異を示します
'a', L'a', "a", L"a" // 字符a;宽字符型字面值a,类型为wchar_t;字符串a,宽字符型字符串a
10, 10u, 10L, 10uL, 012, 0xC // int;unsigned int; long; unsigned long; 八进制数(10);十六进制数(12)
3.14, 3.14f, 3.14L // double; float; long
10, 10u, 10., 10e-2 // int; unsigned; double; double(0.1)
2.6以下の二つの定義が違いはあります
int month = 9, day = 7;
int month = 09, day = 07; // 八进制数, 且09会引起编译器报错, 应为011
2.7以下は何の文字通りの意味を表しますか?それぞれのデータ型は何ですか?
"Who goes with F\145rgus?\012" // 转义字符,\145表示字符e,\012为换行符
3.14e1L // long double型(31.4)
1024f // float型(1024.0)
3.14L // long double型(3.14)
その後、2.8 2M出力エスケープ文字やライン、その後、プログラム出力2を変更することができ、その後、タブを出力し、出力Mを包みます
int main(){
std::cout << "2\x4d\012";
std::cout << "2\t\x4d\012";
return 0;
}
2.9以下の定義は、の意味を説明し、正しい違法で定義されました
std::cin >> int input_value; // input_value应提前定义
int i = {3.14}; // i被赋值为3
double salary = wage = 9999.99; // wage未提前定义, 报错
int i = 3.14; // i被赋值为3
第三の行の、賃金が予め定義されている場合、正しいです
double wage;
double salary = wage = 9999.99; // 该语句定义变量salary,给wage赋值,并对salary初始化
以下の変数のための2.10の初期値は何だったのでしょうか?
std::string global_str; // string类默认初始化为空字符串
int global_int; // 函数体外定义int型, 默认初始化为0
int main(){
int local_int; // 函数体内定义基础类型, 未初始化则值为未定义
std::string local_str; // string类默认初始化为空字符串
}
次のステートメントアウト2.11ポイントが宣言または定義されています
extern int ix = 1024; // 定义, 给extern标记的变量赋值将抵消extern的作用, 变为定义语句
int iy; // 定义和声明
extern int iz; // 声明
2.12州違法である次の名前?
int double = 3.14; // 非法, double为C++保留的关键字
int _; // 在函数体内时非法, 函数体内名字不能以_开头
int catch-22; // 非法, -不是有效名字
int 1_or_2 = 1; // 非法, 不能以数字开头
double Double = 3.14; // 合法但不好, 变量名一般均为小写字母, 自定义类名以大写字母开头
2.13以下のプログラムjの値はどのくらいですか?
int i = 42;
int main(){
int i = 100; // 内层作用域的i覆盖了外层作用域的i
int j = i; // j的值为100
}
2.14以下のプログラムの法的?正当な場合、出力は何ですか?
int i = 100, sum = 0;
for(int i = 0; i != 10; ++i)
sum += i;
std::cout << i << " " << sum << std:endl; // 输出100 45
2.15違法であるかの以下の定義は?なぜ?
int ival = 1.01;
int &rval1 = 1.01; // 非法, 引用不能绑定字面值常量
int &rval2 = ival;
int &rval3; // 非法, 引用必须初始化
2.16どのような割り当ては違法でしょうか?なぜ?
int i = 0, &r1 = i;
double d = 0, &r2 = d;
r2 = 3.14159; // 将3.14159赋给d
r2 = r1; // 将0.0赋给d
i = r2; // 将0赋给i
r1 = d; // 将0赋给i
// 均为合法的
2.17は、次のコードの断片が出力されますどのような結果を実行しますか?
int i, &ri = i;
i = 5;
ri = 10;
std::cout << i << " " << ri << std::endl; // 10 10
オブジェクトのそれぞれについて、2.18の書き込みポインタ値コードの変更とポインタ値
int a = 1, *pa = &a;
*pa = 2; // 改变pa所指对象a的值为2
pa = nullptr; // 改变pa的值为空指针
2.19および説明ポインタ参照の主な違い
(1)参照が初期化される必要があり、その後、オブジェクトは常に結合している、ポインタを初期化することができず、その値は変更することができます
(2)基準自体がオブジェクトではなく、オブジェクト自体がポインタであります
次のコードは、役割について説明2.20
int i = 42;
int *pi = &i; // 指针pi指向变量i
*pi = *pi * *pi; // 取变量i与变量i相乘, 结果存入变量i, 故i的终值为42*42
定義の下で2.21説明、違法かどうかを判断します
int i = 0;
double *dp = &i; // 非法, dp为指向double对象的指针, 但初始化指向了int变量
int *ip = i; // 非法, ip为指针, 不能直接用int变量赋值, 只能用int变量的地址赋值
int *p = &i; // 合法
INT 2.22レッツpはポインタ型で、次のコードの意味を説明します
if(p){} // 若p不是空指针, 执行块中语句
if(*p){} // 若p指向对象不为0, 执行块中语句
2.23ポインタpを考えると、あなたはそれが有効なオブジェクトを指しているかどうかを知ることができますか?
Pとしての文の条件は、条件が偽の場合はnullポインタは、それ以外の場合はtrueの場合
なぜLP pを2.24合法と非合法
int i = 42;
void *p = &i; // void*指针可以指向任意类型的对象
long *lp = &i; // long指针不能指向int变量
以下の変数の型と値の2.25説明
int *ip, i, &r = i; // ip为int指针, i为int变量, r为绑定i的引用
int i, *ip = 0; // i为int变量, ip为int指针,当前值为空
int *ip, ip2; // ip为int指针, ip2为int变量
2.26合法性を決定
const int buf; // 非法,const对象必须初始化
int cnt = 0;
const int sz = cnt; // 合法,const int对象可用int变量初始化
++cnt;
++sz; // 非法,const int变量的值不可改变
初期化の合法性を決定するために2.27
int i = -1, &r = 0; // 非法,引用不能绑定字面值常量
int *const p2 = &i2; // 合法,p2是一个常量指针(顶层const)
const int i = -1, &r = 0; // 合法,常量引用可以绑定字面值常量
const int *const p3 = &i2; // 合法,p3是一个指向常量对象的常量指针
const int *p1 = &i2; // 合法
const int &const r2; // 非法,引用必须初始化,且引用不是对象,不能指定顶层const
const int i2 = i, &r = i; // 合法
2.28以下の定義は違法選び出した、意味しているかを説明します
int i, *const cp; // 非法,常量指针必须初始化
int *p1, *const p2; // 非法,常量指针必须初始化
const int ic, &r = ic; // 非法,ic必须初始化
const int *const p3; // 非法,常量指针必须初始化
const int *p; // 合法,指针p指向int常量
2.29 2.28仮説は定義された変数、合法である次の文となっています
i = ic; // 合法
p1 = p3; // 非法,常量指针不可指向常量对象
p1 = ⁣ // 非法,普通指针不能指向常量对象
p3 = ⁣ // 非法,常量指针的值不可变
p2 = p1; // 非法,常量指针的值不可变
ic = *p3; // 非法,const int的值不可变
2.30の分析対象は、上部または下部のconst CONSTとして宣言され
const int v2 = 0; // 顶层const
int v1 = v2;
int *p1 = &v1, &r1 = v1;
const int *p2 = &v2, *const p3 = &i, &r2 = v2;
// p2底层const, p3既是顶层const也是底层const,r2是底层const
決定した法的以下の声明に基づき2.30 2.31は、上部または下部のconstのconstを反映説明しました
r1 = v2; // 合法,赋值语句,相当于将v2的值赋给v1
// 若为定义语句const int &r1 = v2; 则不合法,因为非const引用不可指向常量对象
p1 = p2; // 不合法,p2为底层const
p2 = p1; // 合法
p1 = p3; // 不合法,p3底层const
p3 = p1; // 不合法,p3顶层const
p2 = p3; // 合法,p2和p3均为底层const
2.32以下のコードは正当なものですか?違法な場合は、正しい修正をしてください
int null = 0, *p = null; // 非法
// 若想让p指向null,应该为int null = 0, *p = &null;
// 若想初始化为空指针,应该为int null = 0, *p = nullptr;
2.33は、運用結果を決定します
int i = 0, &r = i;
auto a = r;
const int ci = i, &cr = ci;
auto b = ci;
auto c = cr;
auto d = &i;
auto e = &ci;
auto &g = ci;
a = 42; // 合法,a为int
b = 42; // 合法,auto忽略顶层const,b为int
c = 42; // 合法,auto忽略顶层const,c为int
d = 42; // 非法,d为int*
e = 42; // 非法,e为const int*,指向int常量的指针
g = 42; // 非法,g为绑定const int的引用
2.34同上。
2.35以下の定義は、そのプログラミングが検証推論種類を決定
const int i = 42; // const int
auto j = i; // int
const auto &k = i; // 指向const int的引用
auto *p = &i; // 指向const int的指针
const auto j2 = i, &k2 = i; // j2为const int, k2为指向const int的引用
各変数の種類次のコードの端部、及びプログラムでそれぞれの値留意2.36
int a = 3, b = 4; // a, b为int
decltype(a) c = a; // c为int
decltype((b)) d = a;// d为指向int的引用
++c;
++d; // 程序结束时,a, b, c, d均为4
式参照を生成する2.37割り当ては、参照型は、左の値の一種であります
int a = 3, b = 4; // a, b为int
decltype(a) c = a; // c为指向int的引用
decltype(a = b) d = a; // d为指向int的引用,其中decltype只返回赋值表达式的类型,不会执行a = b
// a, c, d为3, b为4
差は指定されたタイプと2.38 decltypeで指定された自動タイプでは説明は何ですか
const int a = 1;
auto b = a; // b为int型
decltype(a) c = 1; // c为const int型
2.39コンパイラと実行、ビュー情報
struct Foo {} // 没有分号, 无法编译通过
int main(){
return 0;
}