C Primer Plus 第5章——第二篇

你该逆袭了

三、表达式和语句

1、表达式

(1)表达式 由 运算符 和 运算对象 组成。
(2)子表达式:c / d 是 a * (b + c / d) / 20 的 子表达式。
(3)每个表达式都有一个值。
(4)x = ++q % 3 是 表达式。
(5)6 + (c = 3 + 8) 是 表达式。
在这里插入图片描述

2、语句

C 把 末尾加上一个分号 的表达式都看作是一条语句(即,表达式语句)。
一条完整的指令不一定是一条语句。

8;
3 + 4;
++x;

x = 6 + (y = 5);  
// 该语句中的子表达式 y=5 是一条完整的指令,但是它只是语句的一部分。
// 因为一条完整的指令不一定是一条语句,所以 分号 用于识别在这种情况下的语句(即,简单语句)。

在这里插入图片描述

(1)副作用 和 序列点

(a)副作用

对 数据对象 或 文件 的修改。
在这里插入图片描述

(b)序列点

是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。在 C 语言中,语句中的分号标记了一个序列点。意思是:在一个语句中,赋值运算符、递增运算符、递减运算符对 运算对象 做的改变必须在程序执行下一条语句之前完成。后面会讨论:一些运算符也有序列点。另外,任何一个完整表达式的结束也是一个序列点。
在这里插入图片描述

1、完整表达式

指:这个表达式不是另一个更大表达式的子表达式。
例如:表达式语句中的表达式和while循环中的作为测试条件的表达式,都是完整表达式。

在这里插入图片描述
在这里插入图片描述

3、复合语句(块)

指:用花括号括起来的一条或多条语句,复合语句也称为 块。

四、类型转换

总结:
在 C语言中,许多类型转换都是 自动进行 的。

当 char 和 short 类型出现在 表达式里 或者 作为函数的参数(函数原型除外)时,都会被升级为 int 类型;float 类型 在函数参数中时,会被升级为 double 类型。

在 K&R C (不是 ANSI C)下,表达式中的 float 也会被升级成 double 类型。
当把一种类型的值赋给另一种类型的变量时,值将被转换成与变量的类型相同。
当把较大类型转换成较小类型时,(如 ,long 转换成 short ,或 double 转换成 float),可能会丢失数据。
根据本章介绍的规则,在混合类型的运算中,较小类型会被转换成较大类型。

(1)当类型转换出现在表达式时,无论是 unsigned 还是 signed 的 char 和 short 都会被自动转换成 int,如有必要会被转换成 unsigned int 。(特殊情况见下图)
(2)当作为 函数参数传递时,char 和 short 被转换成 int,float 被转换成 double。
在这里插入图片描述

在这里插入图片描述
(3)如果目标类型是一个 整形,且待赋值的值是 浮点数,该行为是 未定义 的。

#include <stdio.h>

int main()
{
	//如果目标类型是一个 整形,且待赋值的值是 浮点数,该行为是 未定义 的。

	printf("%d\n", -23.5);  //0
	printf("%d\n", 23.12);  //1374389535
}

(4)当浮点型被降级为整数类型时,原来的浮点值会被截断。

#include <stdio.h>

int main()
{
	//当浮点型被降级为整数类型时,原来的浮点值会被截断。

	printf("%d\n", (int)22.15);    //22
	printf("%d\n", (int)-22.15);   //-22
    
	return 0;
}

在这里插入图片描述
在这里插入图片描述

1、强制类型转换运算符

(int)22.38

2、总结:C的一些运算符

在这里插入图片描述
在这里插入图片描述

五、带参数的函数

#include <stdio.h>

void pound(int n);      // ANSI 函数原型申明

int main()
{
	int times = 5;
	char ch = '!';     //ANSII 码是 33
	float f = 6.0f;

	pound(times);      //int 类型的参数
	pound(ch);         
	pound(f);          

	return 0;
}

void pound(int n)
{
	while (n-- > 0)
		printf("#");
	printf("\n");
}

在这里插入图片描述
形参,实参,函数调用

六、关键概念

在这里插入图片描述

1、运算符的特性

对象的数量、优先级、结合律
如果运算符的优先级相等,由结合律(从左往右 或者 从右往左)决定求值顺序。

2、算数运算符要求

运算对象都是相同类型的。因此,C 会进行自动类型转换。尽管如此,不要养成依赖自动类型转换的习惯,应该显示选择合适的类型或使用强制类型转换。这样,就不用担心不必要的自动类型转换。

七、本章小结

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值