跳转至

第 5 章 运算符、表达式和语句

第五章 运算符、表达式与语句

👉【复习题】【编程练习题

1. 基本运算符

1.1 赋值运算符

注意点:C语言中,= 不意味着 “ 相等 ”,而是一种赋值运算符。

int score = 98; // = 号的左边是变量名,右侧是赋给变量的值。
符号 = 被称为赋值运算符。

注意读法:不是score等于98,而是“把值98赋给变量score”。

赋值运算符左侧必须引用一个存储位置,最简单的方式就是使用“变量名”

C使用可修改的左值(modifiable lvalue)标记可赋值的实体。

  • 几个术语:数据对象、左值、右值和运算符

赋值表达式语句的目的:把值储存到内存位置上。

数据对象(Data Object):用于储存值的数据存储区域

使用变量名是标识对象的一种方法。

左值(lvalue):C语言的术语,用于标识特定数据对象的名称或者表达式

对象 指的是实际的数据存储,而左值是用于标识或定位存储位置的标签。

C标准新增了:可修改的左值(Modifiable lvalue),用于标识可修改的对象。

右值:可以是常量、变量或其他可求值的表达式(如:函数调用)。

运算对象:运算符操作的对象。

1.2 加减法运算符

  • 计算加法

    加法运算符(addition operator):用于加法运算,使其两侧的值相加。

    int num01,num02;
    int sum = num01 + num02;
    
  • 计算减法

    减法运算符(Subtraction operator):用于减法运算,使其左侧的数减去右侧的数。

    + 和 -运算符都被称为“二元运算符(Binary Operator)”:需要两个运算对象才可以完成操作。

    int num01,num02;
    int minus = num01 - num02;
    

1.3 符号运算符+、-

一元运算符(unary operator):只需要一个运算对象。

int num01 = -6;
int num02 = +4;

1.4 乘除法运算符

乘法运算符 *

除法运算符 /。/左侧是被除数,右侧的值是除数。

⚠️注意点

  • 整数除法和浮点数除法不相同,因为浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。

  • 整数的除法结果的小数部分会被丢弃,这种过程叫做截断(truncation)。不会四舍五入结果。

  • 混合整数和浮点数计算的结果都是浮点数。C99使用的是趋零截断。

2. 其他运算符

2.1 sizeof运算符和size_t类型

  • sizeof()运算符

    • sizeof运算符以字节为单位返回运算对象的大小

    • 在C语言中,1字节定义为char类型占用的空间大小.

  • size_t 类型

    • C语言规定,sizeof返回size_t类型的值。是无符号整数类型,但它不是新类型。

    • size_t 是语言定义的标准类型。

2.2 求模运算符(modulus operator)

用于整数运算

求模运算符给出左侧整数除以右侧整数的余数(Remainder)

⚠️注意:求模运算符只能用于整数不能用于浮点数

2.3 递增/递减运算符

递增/递减运算符(Increment Operator)执行简单的任务,将其运算对象递增/递减1

有两种形式:

  • 后缀模式(i++/i--)

    使用i的值之后,递增/递减1

  • 前缀模式(++i/--i)

    前缀:使用i之前的值之前,递增/递减1

3. 表达式与语句

C语言的基本步骤由语句组成,大多数的语句由表达式构成。

3.1 表达式(Expression)

表达式由运算符运算对象组成。

3.2 语句(statement)

语句是C程序的基本模块。一条语句相当于一条完整的计算机指令。在C中,大部分语句以分号结尾。

  • 简单的语句是空语句(一个分号结尾)。

    ; // 空语句
    
  • 赋值表达式语句:shoes = 40;

  • 函数表达式语句:printf("sam = %d\n",sam);

3.3 复合语句(块)

复合语句(compound statement)使用花括号括起来的一条或者是多条语句,复合语句也称为块(block)

例如:while语句块

1
2
3
4
5
6
index = 0;
while(index++<10)
{
    sam = 10 * index + 2;
    printf("sam = %d \n",sam);
}

4. 类型转换

4.1 基本的类型转换规则

  • 当类型转换出现表达式时,无论是unsigned还是signed的char和short都会自动转换成int.

  • 涉及到两种类型的运算,两个值会被分别转换成两种类型的更高级别。

  • 类型的级别从高到低依次是:long double、double、float、unsigned long、long long、unsigned long、long unsigned int、int。

    如果当long和int的大小相同是,unsigned int 会比 long 的级别高。

  • 赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。会发生升级或者是降级。

    升级:从较小类型转换成较大类型。

    降级:把一种类型转换成更低级别的类型。当浮点类型被降级为整数类型时,原来的浮点值会被截断。

  • 当作为函数参数传递时,char和short被转换成int,float被转换成double。

4.2 对于待赋值的值与目标类型不匹配的情况时,规则如下:

  • 目标类型是无符号整型,且待赋的值是整数,额外的位将被忽略。

  • 如果目标类型是一个有符号整型,且待赋的值是整数,结果因实现而异。

  • 如果目标类型是一个整型,且待赋的值是浮点数,这种行为是未定义的。

5. 带参数的函数

函数原型:就是函数的声明,描述了函数的返回值参数

如果函数不接受任何参数,函数头的圆括号中应该写上关键字void

声明函数就创建了被称为形式参数(formal argument或者formal parameter,简称形参)的变量。

被函数调用传递的值称为实际参数(actual argument或者是actual parameter,简称实参)

形参变量实参就是函数调用提供的值,实参被赋给相应的形参。

变量名是函数私有的,即在函数中定义的函数名不会和别处的相同名称发生冲突。