1月12日 C Primer Plus学习

笔记

5.4 表达式和语句

5.4.1 表达式

表达式由运算符和运算对象组成。最简单的表达式是一个单独的运算对象,以此为基础可以建立复杂的表达式。

运算对象可以是常量、变量或者二者的组合。一些表达式由子表达式组成。

每个表达式都有一个值。

要获得这个值,必须根据运算符优先级规定的顺序来执行操作。

5.4.2 语句

语句是C 程序的基本构建块。一条语句相当于一条完整的计算机指令。

最简单的语句是空语句

;//空语句

C 把末尾加上一个分号的表达式都看作是一条语句。

8;
3 + 4;

但是,这些语句什么都不做,不算是真正有用的语句。

副作用是对数据对象或文件的修改。例如:

states = 50;

这似乎更像是主要目的。但是从C 语言的角度看,主要目的是对表达式求值。

使用它们的主要目的就是副作用。

类似地,调用printf()函数时,它显示的实际信息其实是副作用。

完整表达式是指这个表达式不是另一个更大表达式的子表达式。

5.4.3 复合语句(块)

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

5.5 类型转换

通常,在语句和表达式中应使用类型相同的变量和常量。

但是,如果混合使用类型,C 不会停在那里死掉,而是采用一套规则进项自动类型转换。

从较小类型转换为较大类型,这些转换被称为升级。反之降级。

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

​ 如有必要会被转换成unsigned int(如果short与int的大 小相同,unsigned short就比int大。这种情况下,unsigned short会被转换成 unsigned int)。

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

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

    • 例外的情况是,当 long 和 int 的大小相同时,unsigned int比long的级别高。

    • 之所以short和char类 型没有列出,是因为它们已经被升级到int或unsigned int。

  • 在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级。

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

    当待赋值的值与目标类型不匹配时:

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

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

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

5.5.1 强制类型转化运算符

通常,应该避免自动类型转换,尤其是类型降级。但是如果能小心使用,类型转换也很方便。

有时需要进行精确的类型转换,或者在程序中表明类型转换的意图,要用到强制类型转换,即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。圆括号和它括起来的类型名构成了强制类型转换运算符,其通用形式是:(type)

一般而言,不应该混合使用类型(因此有些语言直接不允许这样做),但是偶尔这样做也是有用的。

练习

C Primer Plus 5.11 第3题

点击查看代码
#include<stdio.h>
int main(void)
{
	printf("请输入天数:\n");
	int days;
	scanf("%d",&days);
	while(days>0)
	{
		unsigned int weeks = days / 7;
		unsigned int day = days % 7;
		printf("%d天是%d周%d天",days,weeks,day);
		printf("\n请输入天数:\n");
		scanf("%d",&days);
	}
	return 0;
}

C Primer Plus 5.11 第4题

点击查看代码
#include<stdio.h>
int main()
{
	printf("请输入一个身高(厘米):(小于等于0 退出)\n");
	float cm;
	scanf("%f",&cm);
	while(cm>0)
	{
		int feet = cm / 30.48;
		float inches = (cm - feet * 30.48) / 2.54;
		printf("%.1f厘米 = %.1d英尺,%.1f英寸\n",cm,feet,inches);
		printf("请输入一个身高(厘米):(小于等于0 退出)\n");scanf("%f",&cm);
	}
	return 0;
}
posted @ 2022-01-30 15:01  shucharjer  阅读(38)  评论(0)    收藏  举报