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;
}
浙公网安备 33010602011771号