第二篇
ch4 表达式
4.1表达式
4.2算术操作符
- 标准 C++头文件 limits 提供了与内置类型表示有关的信息 例如一个类型能表示的最大值和最小值 另外 C++编译系统也提供了标准 C 头文件 climits 和 cfloat 它们定义了提供类似信息的预处理器宏 ,使用这些头文件来防止溢出 overflow 和下underflow
- 浮点数的算术运算的精度问题.
练习 4.1
下列两个除法表达式的主要区别是什么
double dval1 = 10.0, dval2 = 3.0;
int ival1 = 10, ival2 = 3;
dval1 / dval2;
ival1 / ival2;
练习 4.2
给出一个有序对象 可用什么操作符来判定它是奇数还是偶数 写出表达式
练习 4.3
在你的系统中找到并检查 C++头文件 limits 和标准 C 头文件 climits 以及 cfloat
4.3 等于 关系和逻辑操作符
练习 4.4
下列哪个表达式不正确或不可移植 为什么 怎样改正 注意 在这些例子中对象的
类型并不重要
(a) ptr->ival != 0 (b) ival != jval < kval
© ptr != 0 && *ptr++ (d) ival++ && ival
(e) vec[ ival++ ] <= vec[ ival ];
练习 4.5
二元操作符的计算顺序未定义 因而允许编译器自由地提供可选的实现 这是在 有效
的实现 和 程序员使用的语言存在潜在缺点 之间的一种折衷 你认为这是一种可接受的
折衷吗 为什么?
4.4 赋值操作符
- 复合赋值加操作符
复合赋值操作符的一般语法格式是
a op= b;
这里的 op=可以是下列十个操作符之一
+= -= *= /= %=
<<= >>= &= ^= |=
每个复合赋值操作符都等价于以下 普通写法 的赋值
a = a op b;
练习 4.6
下列代码合法吗 为什么 怎样改正
int main() {
float fval;
int ival;
int *pi;
fval = ival = pi = 0;
}
练习 4.7
虽然下列表达式不是非法的 但是它们的行为并不像程序员期望的那样 为什么 怎样修改以使其能反映程序员的可能意图
(a) if ( ptr = retrieve_pointer() != 0 )
(b) if ( ival = 1024 )
( c ) ival += ival + 1;
4.5 递增和递减操作符
练习 4.8
你认为为什么 C++不叫++C
-说明它本质上是从c语言演化而来的,“++”是c语言里的自增操作符。c++语言是c语言的超集,是在c语言基础上的扩展,是先有c语言,再++。根据自增操作符前后式的差别,c++表示对c语言进行扩展以后,还可以使用c语言的内容。而++c则表示无法再使用c的原始值了。后置 postfix 形式表示:这个新值直到下一次迭代才能被实际使用.
4.6 复数操作
complex 头文件定义了用于处理复数的功能。complex<T> 模板类型的实例表示的是复数,这里定义了 3 个特化类型:complex<float>、complex<double>、complex<long double>。
norm() 函数模板会返回复数的量的平方。
arg() 模板会返回以弧度为单位的相角,是复数 z 对应的 std::atan(z.imag()/z.real())。
conj() 函数模板会返回共轭复数,是 a+bi 和 a-bi。
polar() 函数模板接受量和相角作为参数,并返回和它们对应的复数对象。
prqj() 函数模板返回的复数是复数参数在黎曼球上的投影。
#####4.7 条件操作符
int max = ( (i > j) ? (( i > k) ? i : k) : ( j > k ) ? j : k);
4.6 sizeof 操作符
siseof 操作符的作用是返回一个对象或类型名的字节长度 它有以下三种形式
-
sizeof (type name );
扫描二维码关注公众号,回复: 15260465 查看本文章 -
sizeof ( object );
-
sizeof object;
返回值的类型是 size_t 这是一种与机器相关的 typedef 定义 -
当 sizeof 操作符应用在数组上时 返回整个数组的字节长度
-
应用在指针类型上的 sizeof 操作符返回的是包含该类型地址所需的内存长度
-
应用在引用类型上的 sizeof 操作符返回的是包含被引用对象所需的内存长度
-
应用在 char 类型上时 在所有的 C++实现中结果都是 1
4.9 new 和 delete 表达式
- new 表达式返回指向新分配的对象的指针
- 当对象完成了使命时 我们必须显式地把对象的内存返还给空闲存储区
- delete 表达式不应该被应用在 不是通过 new 表达式分配的指针上
练习 4.11
下列语句哪些是非法的或错误的
(a) vector svec( 10 );
(b) vector *pvec1 = new vector(10);
© vector **pvec2 = new vector[10];
(d) vector *pv1 = &svec;
(e) vector *pv2 = pvec1;
(f) delete svec;
(g) delete pvec1;
(h) delete [] pvec2;
(i) delete pv1;
(j) delete pv2;
4.10 逗号操作符
4.11 位操作符
4.12 bitset 操作
#include < bitset>
4.13 优先级
4.14 类型转换 ?
隐式/算术/显式(强制)
4.15 栈类实例 ?
ch5 语句
5.1 简单语句和复合语句
5.2声明语句
5.3 if语句
5.4 switch语句
记录元辅音字母的个数
#include <iostream>
#include <ctype.h>
int main()
{
char ch;
int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0,
consonantCnt = 0;
while ( cin >> ch )
switch ( ch )
{
case 'a': case 'A':
++aCnt;
break;
case 'e': case 'E':
++eCnt;
break;
case 'i': case 'I':
++iCnt;
break;
case 'o': case 'O':
++oCnt;
break;
case 'u': case 'U':
++uCnt;
break;
default:
if ( isalpha( ch ))
++consonantCnt;
break;
}
cout << "Number of vowel a: \t" << aCnt << '\n'
<< "Number of vowel e: \t" << eCnt << '\n'
<< "Number of vowel i: \t" << iCnt << '\n'
<< "Number of vowel o: \t" << oCnt << '\n'
<< "Number of vowel u: \t" << uCnt << '\n'
<< "Number of consonants: \t" << consonantCnt << '\n';
}
5.5 for循环语句
5.6 while语句
5.7 do while语句
5.8 break语句
5.9 continue语句
5.10 goto语句
5.11 链表
ch6 函数类型
顺序容器: list 和 vector
关联容器: map 映射 和 set 集合 m