C Primer Plus学习_13 表达式和语句+类型转换


前几章我们多次使用了表达式和语句,现在我们来进一步学习他们。

表达式

C程序的基本步骤有语句组成,而大多数语句都有表达是构成。因此我们先讨论表达式。

表达式:由运算符和运算对象组成(运算对象是运算符的操作对象)。最简单的表达式是一个单独的运算对象(就像4、-6),以此为基础可以建立复杂的表达式(就像p<4+4)。更专业一点可以这么说,运算对象可以是由变量、常量、二者的组合。一些表达式有子表达式组成(即较小的表达式)。

C表达式的一个最重要的特性就是每一个表达式都有一个值。要获得这个值,必须根据运算符优先级进行操作。  

下面给出几个表达式:

  1. x = 6 * 6;
  2. x > 6;

关于表达式的值的问题,我们来看看上面两个表达式的值分别是多少。1式,是一个计算式,那么它的值就是6*6的结果36;2式是一个判断式,这样的式子在前面早已出现过多次,比如while循环的()里就有这样的表达式,它的值不是0就是1,条件为假就是0,条件为真就是1。(真假判断这些,我们在下面的内容中或重点讲到,这里只要知道判断式的值非0即1 。


语句

语句是c程序的基本构建块,一条语句相当于一条计算机指令,在C程序中,大部分语句都以“;”结尾。

形如x = 2只是一个表达式,而x = 2;才是一条语句。(还有一种语句叫做空语句“;”)

/*addemup.c -- 几种常见的语句*/
#include <stdio.h>
int main(void)
{
	int count, sum;
	
	count = 0;
	sum = 0;
	while (count++ < 20)
		sum = sum + count;
	printf("sum = %d\n", sum);
	
	return 0;	
 } 

在这个程序中要提醒大家的是,声明不是表达式语句。也就是说,如果删除什么后面的分号,剩下的部分不是一个表达式,也没有值。(说实话,没太看明白)赋值表达式语句在程序中非常常用:它为变量分配一个值。

 复合语块(块)

复合语句(或块):由花括号括起来的一条或多条语句组成,如下:

	while(++shoe <= 18) 
	{
		foot = SCALE * shoe + ADJUST;	
		printf("%10.1f %15.2f inches\n", shoe, foot);
	
	}

这就是一条复合语句。


类型转换

通常在已经和表达式中应使用类型相同的变量和常量,但如果使用混合类型,C会采用一套规则进行自动类型转换。这看上去很方便,但是会有一定的危险性。可能会出现莫名其妙的结果,在前面的某篇文章中有出现过。

  1. 当类型转换出现在表达式时,无论是unsigned 还是 signed的char 和 short(对应4种类型) 都会变成int如果有必要会转换成unsigned int 。
  2. 涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
  3. 类型的级别从高到低依次是 long double > double > float > unsignedlong long > long long > unsigned long > long > unsigned int > int 。(例外情况)当long 和 int 的大小相同时,unsigned int 比 long级别高。
  4. 在赋值表达式语句中,计算的最终结果会被转换成赋值变量的类型,其过程可能升级也可能降级。

类型升级通常不会有什么麻烦,但是降级的能会出问题。原因很简单,较低的类型可能不能放下整个数字,取决于类型可存放的字节数。  

/*convert.c -- 自动类型转换*/
#include <stdio.h>
int main (void)
{
	char ch;
	int i;
	float fl;
	
	fl = i = ch = 'C';
	printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl);
	ch = ch + 1;
	i = fl + 2 * ch;
	fl = 2.0 * ch + i;
	printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl);
	ch = 80.98;
	printf("Now ch = %c\n", ch);
	
	return 0;
 } 

运行结果为:

ch = C, i = 67, fl = 67.00
ch = D, i = 203, fl = 339.00

Now ch = P

改成几乎涵盖了上面的内容,大家可以一一验证。

【强制类型转换】

我们作为程序的操控者,不能看着自己的出因为自动转换而出错,所以就有了强制类型转换,其目的是为了避免错误的发生。强制类型转换的格式也很简单,形如:m = (int)1.2345 + (int)6.789  这样在右值前面加上“(类型名)”,右值就会转换成该类型。总之尽量避免这样的事情发生才是根本。

昨天满课所以没写。。。。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值