C/C++基础复习(四)表达式

C/C++ 2014年06月29日 ,

经过对数组与指针的复习后,继续对C/C++的表达式进行温习。http://furzoom.com/

表达式

表达式由一个或多个操作数通过操作符组合而成。重要理解操作符的优先级结合性求值顺序

算术操作符

算术操作符

操作符 功能 用法
+ unary plus + expr
- unary minus - expr
* multiplication expr * expr
/ division expr / expr
% remainder expr % expr
+ addition expr + expr
- subtraction expr - expr

以上,一元操作符的优先级最高,其次是乘、除、取余,接着是二元加、减法。一元操作符是右结合,二元操作符是左结合。

注意

  1. 如果两个操作数都为正,除法和求模操作的结果也是正数(或零)。
  2. 如果两个操作数都为负,除法结果为正数(或零),求模结果为负数。
  3. 如果只有一个操作数是负数,两种操作的结果取决于机器;求模结果符号也取决于机器,而除法的结果则是负数。

关系操作符和逻辑操作符

关系操作符和逻辑操作符使用算术或指针类型的操作数,并返回bool类型的值。

关系操作符和逻辑操作符

操作符 功能 用法
! logical NOT !expr
< less than expr < expr
<= less than or equal expr <= expr
> greater than expr > expr
>= greate than or equal expr >= expr
== equality expr == expr
!= inequality expr != expr
&& logical AND expr && expr
|| logical OR expr || expr

注意:逻辑与操作和逻辑或操作的短路求值

位操作符

位操作符使用整型的操作数。

位操作符

操作符 功能 用法
~ bitwise NOT ~expr
<< left shift expr << expr
>> right shift expr >> expr
& bitwise AND expr & expr
^ bitwise XOR expr ^ expr
| bitwise OR expr | expr

注意:位操作符操纵的整数类型可以是有符号的也可以是无符号的。如果操作数为负数,则位操作符如何处理其操作数的符号位依赖于机器。

如果要管理30个学生的是否通过考试,可以让每个同学对应一个二进制位。如,

bitset bitset_quiz1;     // bitset solution
unsigned long int_quiz1 = 0; // simulated collection of bits
bitset_quiz1.set(27);        // indicate student number 27 passed
int_quiz1 |= 1UL<<27;        // indicate student number 27 passed
bitset_quiz1.reset(27);      // student number 27 failed
int_quiz1 &= ~(1UL<<27);     // student number 27 failed
bool status
status = bitset_quiz1[27];   // how did student number 27 do?
status = int_quiz1 & (1UL<<27);

输入与输出重载了移位操作符,移位操作符是左结合的。

赋值操作符

赋值操作符具有右结合性。

复合赋值操作符,

+=    // arithmetic operators
-=
*=
/=
%=
<<=   // bitwise operators >>=
&=
^=
|=

自增和自减操作符

自增++和自减--分为前置操作符和后置操作符。一般能采用前置时不采用后置,可以提高程序效率。

箭头操作符

箭头->操作符用于使用指针来访问其所指对象的成员。点(.)操作符用于获取类类型对象的成员。

条件操作符

条件操作符( ? :)是C++中唯一的三元操作符。

使用条件操作符时就避免操作符的深度嵌套,如必须使用则就使用括号,提高程序的可读性。

sizeof操作符

sizeof操作符返回一个对象或类型名的长度,返回值类型为size_t,长度单位时字节。

逗号操作符

逗号表达式是一组由逗号分隔的表达式,表达式从左向右计算。逗号表达式的结果是其最右表达式的值。

复合表达式的求值

含有两个或更多操作符的表达式称为复合表达式

表达式求值顺序由运算符的优先级决定,当优先级相同时,结合性决定求值顺序。

操作符优先级

Associativity and Operator Function Use
L :: global scope ::name
L :: class scope class::name
L :: namespace scope namespace::name
L . member selectors object.member
L -> member selectors pointer->member
L [] subscript variable[expr]
L () function call name(expr_list)
L () type construction type(expr_list)
R ++ postfix increment lvalue++
R -- postfix decrement lvalue--
R typeid type ID typeid(type)
R typeid run-time type ID typeid(expr)
R explicit cast type conversion cast_name<type>(expr)
R sizeof size of object sizeof expr
R sizeof size of type sizeof(type)
R ++ prefix increment ++ lvalue
R -- prefix decrement -- lvalue
R ~ bitwise NOT ~ expr
R ! logical NOT !  expr
R - unary minus - expr
R + unary plus + expr
R * dereference * expr
R & address-of & expr
R () type conversion (type) expr
R new allocate object new type
R delete deallocate object delete expr
R delete [] deallocate object delete[] expr
L ->* ptr to member select ptr->*ptr_to_member
L .* ptr to member select obj.*ptr_to_member
L * multiply expr * expr
L / divide expr / expr
L % modulo(remainder) expr % expr
L + add expr + expr
L - subtract expr - expr
L << bitwise shift left expr << expr
L >> bitwise shift right expr >> expr
L < less than expr < expr
L <= less than or equal expr <= expr
L > greater than expr > expr
L >= greater than or equal expr >= expr
L == equality expr == expr
L != inequality expr != expr
L & bitwise AND expr & expr
L ^ bitwise XOR expr ^ expr
L | bitwise OR expr | expr
L && logical AND expr && expr
L || logical OR expr || expr
R ?: conditional expr ? expr : expr
R = assignment lvalue = expr
R *=, /=, %= compound assign lvalue += expr, etc.
R +=, -=
R <<=, >>=
R &=, |=, ^=
R throw throw exception throw expr
L , comma expr, expr

new和delete表达式

尽管现代计算机的内存容量越来越大,但是自由存储区总有可以被耗尽。如果程序用完了所有可用的内存,new表达式就有可以失败。如果new表达式无法获取需要的内存空间,系统将抛出名为bas_alloc的异常。因此,在使用完new申请的内存后,就及时使用delete释放内存。

delete后的指针变成悬垂指针,虽然仍指向原内存地址,但其值将无效。

常见错误:

  1. 删除指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态内存失败称为“内存泄漏(memory leak)”。内存泄漏很难发现,一般需等应用程序运行了一段时间后,耗尽了所有内存空间,内存泄漏都会显露出来。
  2. 读写已删除的对象。如果删除指针指向的对象之后,将指针置为0值,则比较容易检测出来这类错误。
  3. 对同一个内存空间使用再次delete表达式。当两个指针指向同一个动态创建的对象,删除时就会发生错误。可能会自由存储区破坏。

类型转换

隐性类型转换发生在以下三种情况下:

  1. 在混合类型的表达式中,其操作数被转换为相同的类型。
  2. 用作条件表达式被转换为bool类型。
  3. 将表达式的值赋给变量时,将表达式的值转换为该变量的类型。

算术转换,基本原则是整型提升,对于所有比int小的整型,包括char、signed char、unsigned char、short和unsighed short,如果该类型的所有可能的值都能包容在int内,它们就会被提升为int型,否则,它们将被提升为unsigned int。如果将bool值提升为int,则false转换为0,而true则转换为1。

指针转换,多数情况下数组都会自动转换为指向第一个元素的指针。不会转换的情况有:

  1. 数组用作取地址(&)操作符的操作数或sizeof操作符的操作数时。
  2. 用数组对数组的引用进行初始化时。

其他指针的转换:

  1. 指向任意数据类型的指针都可转换为void*类型。
  2. 整形数值常量0可转换为任意指针类型。

显示类型转换的使用:

  1. 需要覆盖通常的标准转换。
  2. 需要多种转换时,选择一种特定类型转换。
double dval;
int ival
ival *= static_cast(dval); // converts dval to int

命名的强制类型转换:

  1. dynamic_cast支持运行时识别指针或引用所指向的对象。
  2. const_cast去掉表达式的const属性。
  3. static_cast一般类型转换及对void*类型的转换。
  4. reinterpret_cast为操作数的位模式提供较低层次的重新解释。

C++支持C风格的强制类型转换,但不提倡使用。

Terms

arithmetic conversion

associativity

binary operators

cast

compound expression

const_cast

conversion

dangling pointer

delete expression

dynamic_cast

expression

implicit conversion

integral promotions

new expression

operands

operator

operator overloading

order of evaluation

precedence

reinterpret_cast

result

static_cast

unary operators

~ operator

, operator

^ operator

| operator

++ operator

-- operator

<< operator

>> operator

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《C/C++基础复习(四)表达式》
日志链接:http://furzoom.com/c-cplusplus-primetive-knowledge-4/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部