C Primer Plus (第五版)中文版——第 5 章 运算符、表达式和语句

5.2  基本运算符

C 使用运算符(operator)来代表算术运算。基于算术运算的运算符包括:=、+、-、*、/。

5.2.1  赋值运算符:=

bwm = 2000;

赋值运算符(assignment operator)“=”不表示“相等”,而是一个赋值运算符。上面的赋值语句读为:“将值2000赋给变量 bwm”。赋值运算符的动作是从右到左。赋值运算符的左边应该是一个可修改的左值。

几个术语:数据对象、左值、右值、操作数

  • 数据对象(data object):泛指数据存储区的术语,数据存储区能用于保存值
  • 左值(lvalue):用于标识一个特定数据对象的名字或表达式
  • 右值(rvalue):能赋给可修改的左值的量,可以是常量、变量或表达式
  • 操作数(operand):运算符操作的对象

5.2.2  加法运算符:+

income = salary + bribes;

加法运算符(addition operator)“+”使得在它两侧的值被加到一起。操作数可以是常量也可以是变量。上面的语句先查找右边两个变量的值,将它们加起来,最后将这个和赋给变量 income。

5.2.3  减法运算符:-

takehome = 224-24;

减法运算符(subtraction operator)“-”从它左边的数中减去它右边的数。操作数可以是常量也可以是变量。上面的语句从224中减去24,最后将差值赋给变量 takehome。

“+”和“-”被称为二元(binary)或双值(dyadic)运算符,表示它们需要两个操作数。

5.2.4  符号运算符:- 和 +

rocky = -12;
smokey = -rocky;

负号“-”可以用于指示或改变一个值的代数负号。上面的语句将值12赋给变量 smokey。当这样使用负号时,称它为一元运算符,表示它只需要一个操作数。

正号“+”不改变它的操作数的值或符号,只是使您能够使用下面的语句而编译器不会报错。

dozen = +12;

5.2.5  乘法运算符:*

cm = 2.54 * inch;

乘法运算符“*”将其左右两边的值相乘。上面的语句将2.54与变量 inch 的值相乘,然后将结果赋给 cm。

5.2.6  除法运算符:/

four = 12.0/ 3.0;

除法运算符“/”使其左边的值被其右边的值除。上面的语句将3.0除12.0,得到值4.0赋给变量 four。

整数除法运算和浮点数除法运算有很大不同。整数除法运算产生一个整数结果,浮点数除法运算产生一个浮点数结果。在 C 中,整数除法采取“趋零截尾”原则,舍弃整个小数部分。如:7/4=1;而7.0/4=1.75。

5.2.7  运算符的优先级

C 通过建立一个运算符的优先顺序来满足运算需求。

运算符 结合性
( ) 从左到右
+  -(一元运算符) 从右到左
*  / 从左到右
+  -(二元运算符) 从左到右
= 从右到左

5.2.8  优先级和求值顺序

当两个运算符共享一个操作数时,优先级规定了求职的顺序。有同样优先级的运算符共享一个操作数时,根据结合性进行运算。如:12/3*2,* 和 / 有相同的优先级,因此根据结合性从左到右进行运算,结果为8。(如果从右到左,结果为2,错误)

5.3  其他运算符

5.3.1  sizeof 运算符和 size_t 类型

sizeof 运算符以字节为单位返回其操作数的大小。操作数可以是一个具体的操作对象,或者一个类型。C 规定 sizeof 返回 size_t 类型的值,这是一个无符号整数类型,可以使用 %zd(或 %u 或 %lu)作为 size_t 类型值的 printf() 说明符。

5.3.2  取模运算符:%

取模运算符(modulus operator)“%”只能用于整数运算。取模运算符计算出用它右边的整数去除它左边的整数所得到的余数。

C99 规定:不管在什么情况下,如果 a 和 b 都是整数值,a % b = a - (a / b) * b。

5.3.3  增量运算符:++

增量运算符(increment operator)将其操作数的值增加1。

  • 前缀(prefix)模式:++ultra
  • 后缀(postfix)模式:super++

5.3.4  减量运算符:--

减量运算符(decrement operator)将其操作数的值减去1。

  • 前缀(prefix)模式:--count
  • 后缀(postfix)模式:count--

5.3.5  优先级

增量和减量运算符的优先级仅低于圆括号。运算原则:当 n++ 是表达式的一部分时,它表示:“先使用 n,再将 n 的值增加”;同理,当 ++n 表示:“先将 n 的值增加,再使用 n”。该原则对减量运算符同样适用。

5.3.6  不要太聪明

  • 如果一个变量出现自同一函数的多个参数中时,不要将增量运算符或减量运算符用于它上面
  • 当一个变量多次出现在一个表达式里,不要将增量运算符或减量运算符用于它上面

5.4  表达式和语句

5.4.1  表达式

表达式(expression)由运算符和操作数组合构成。最简单的表达式是一个单独的操作数,以此为基础可以建立复杂的表达式。一些表达式是多个较小的表达式的组合,这些小的表达式被称为字表达式。每个表达式都有一个值。

5.4.2  语句

语句(statement)是构成程序的基本成分,程序(program)是一系列带有某种必须的标点的语句集合。一个语句是一条完整的计算机指令。在 C 中,语句用结束处的一个分号标识。如:legs = 4 是一个表达式,而 legs = 4; 是一个语句。

  • 副作用(side effect)是对数据对象或文件的修改
  • 顺序点(sequence point)是程序执行的一点,在该点处,所有的副作用都在进入下一步前被计算。在 C 中,语句里的分号标志了一个顺序点;任何一个完整的表达式的结束也是一个顺序点。

5.4.3  复合语句(代码块)

复合语句(compound statement)是使用花括号组织起来的两个或更多的语句,也被称为代码块(block)。

int toes;                         /*声明语句:*/
toes = 10;                        /*赋值语句:*/
printf("%d\n", toes);             /*函数调用语句:*/
while(toes < 20) toes = toes + 2; /*结构化语句:*/
;                                 /*空语句:*/
while(years < 2018)               /*复合语句:*/
{
        wisdom = wisdom * 1.05;
        printf("%d %d", years, wisdom);
        years = years + 1;
}

5.5  类型转换

指派运算符(cast operator)的一般形式为:圆括号和其中的类型名。下例中,mice 为 int 变量:

mice = 1.6 + 1.7;
mice = (int)1.6 + (int)1.7;

第一条语句使用自动转换:先将1.6与1.7相加,得到3.3,然后通过截尾被转换成3赋值给 mice,最终 mice 值为3。

第二条语句使用指派运算符,先将1.6和1.7转换为整数(1),再相加得到2,赋值给 mice,最终mice值为2。

5.6  带有参数的函数

#include 
void pound(int n);	/*函数原型*/
int main(void)
{
	int weight = 150;
	pound(weight);	/*函数调用*/
	return 0;
}

void pound(int n)	/*函数定义*/
{
	printf("You are %d pounds weight.\n", n);
}

函数原型:void pound(int n);

  • pound() 函数没有返回值
  • pound() 函数接受一个 int 类型的参数。

函数头:void pound(int n)

  • int 表示函数接受一个 int 类型的参数。
  • 声明一个参数就创建了一个被称为形式参量(formal parameter)的变量。本例中,形式参量是叫做 n 的 int 类型变量
  • 函数调用 pound(weight) 将实际参数(actual argument)传递给形式参量。本例中,实际参数是叫做 weight 的 int 类型变量

5.11  编程练习

编程练习参考程序

你可能感兴趣的:(C,Primer,Plus)