练习4.31 本节的程序使用了前置版本的递增运算符和递减运算符,解释为什么要用前置版本而不用后置版本。要想使用后置版本的递增递减运算符需要做哪些改动?使用后置版本重写本节的程序。
尽可能用前置的递增递减运算符。可以直接将前置的递增递减运算符改成后置的递增递减运算符。
练习4.32 解释下面这个循环的含义。
constexpr int size = 5;
int ia[size] = { 1, 2, 3, 4, 5 };
for (int *ptr = ia, ix = 0;
ix != size && ptr != ia+size;
++ix, ++ptr) { /* ... */ }
ptr和ix分别以指针和索引的方式遍历ia数组。
练习4.33 根据4.12节中的表说明下面这条表达式的含义。
someValue ? ++x, ++y : --x, --y
优先级排序:++/-- > ? : > , 所以该语句的执行顺序为:
(someValue ? ++x, ++y : --x), --y
含义:如果someValue值为真则 x,y自增1后返回y的值,丢弃y值,然后自减y,返回y的值,作为表达式的值;如果someValue值为假则 x自减1后返回x的值,丢弃x值,然后自减y,返回y的值,作为表达式的值。
练习4.34 根据本节给出的变量定义,说明下面的表达式中将发生什么样的类型转换:
if(fval) dval = fval + ival; dval + ival * cval;
(a) fval -> bool
(b) ival -> float, 加法结果 -> double
© cval -> int, 乘法结果 -> double
练习4.35 假设有如下的定义:
char cval; int ival; unsigned int ui;
float fval; double dval;
请回答下面的表达式中发生了隐式类型转换吗?如果有,指出来。
(a)cval = 'a' + 3; (b)fval = ui - ival * 1.0;
(c)dval = ui * favl; (d)cval = ival + fval + dval;
(a)发生了'a'被转换为int,之后加法结果转换为char
(b)发生了ival被转换为double, ui被转换为double,加法结果被转换为float
©ui首先转换为float类型,结果在转换为double类型
(d)ival首先转换为float类型,第一个加法结果转换为double类型,最终结果再转换为char类型
练习4.36 假设i是int类型,d是double类型,书写表达式i*=id使其执行整数类型的乘法而非浮点类型的乘法
i *= static_cast<int>(id);
练习4.37 用命名的强制类型转换改写下列旧式的转换语句
int i; double d; const string *ps; char *pc; void *pv;
(a) pv = (void*)ps;
(b) i = int(*pc);
(c) pv = &d;
(d) pc = (char*)pv;
pv = reinterpret_cast<void*>(const_cast<string*>(ps));
i = static_cast<int>(*pc);
pv = reinterpret_cast<void*>(&d);
pc = reinterpret_cast<char*>(pv);
练习4.38 说明下面这条表达式的含义。
double slope = static_cast<double>(j/i);
将 j/i 的结果值转换为 double,然后赋值给slope。
本文深入探讨C++中的递增递减运算符、循环遍历、条件与逗号运算符、类型转换等核心概念。解析了前置与后置版本的使用场景,以及在不同上下文中类型如何自动或强制转换。

被折叠的 条评论
为什么被折叠?



