C语言从零开始(六)-运算符与类型转换
今天谈到的知识其实之前或多或少都接触过了,我们再把它整理一下。编程中几个基本的动作是运算、判断和比较,我们接下来的内容就重点学习这些。
一,算术运算符
算术运算符分为单目和双目操作:
- 单目操作是指对一个操作数进行操作。例如: -a是对a进行一目负操作。
- 双目操作(或多目操作)是指两个操作数(或多个操作数)进行操作。
1.双目运算符
这个比较好理解,如同数学中的运算符号。
+ : 加法运算
- : 减法运算
* : 乘法运算
/ : 除法运算
% : 求余运算(又叫模运算)
重点说一下后两个运算符:
- 除法运算符左右两边的数据类型决定了运算结果的类型。两边都是整数结果为整数,有任一方是小数,结果为小数。如果两个整数相除有余数,舍弃余数。运算符右边的数不能为0
- 整除运算符左右两边的数据必须都是整数,结果是这两个数相除的余数值。如果能整除,结果为0
下面我们用一段代码说明这四个运算符的用法:
int a = 3;
int b = 2;
int sum, diff, product, res, mod;
// +
sum = a + b;
printf("sum = %d\n", sum);
// -
diff = a - b;
printf("diff = %d\n", diff);
// *
product = a * b;
printf("product = %d\n", product);
// /
res = a / b;
printf("res = %d\n", res);
// %
mod = a % b;
printf("mod = %d\n", mod);
这段代码的结果如下:
运行结果2. 单目运算符
C语言中有两个很有用的单目运算符。这两个运算符就是增1和减1运算符"++"和"--"。
- ++ 操作数加1
- -- 操作数减1
如:
x = x + 1;
x++;
++x;
这三句意义相同。
x = x - 1;
x--;
--x;
这三句意义也相同。
自增和自减运算需要注意这样的问题:
x = m++;
x = ++m;
这两句的结果完全不同。
x = m++; // 表示将m的值赋给x后, m加1。
x = ++m; // 表示m先加1后, 再将新值赋给x。
我们看一下这段代码:
int a = 1;
int b = 1;
int ret;
ret = a++;
printf("ret = %d, a = %d\n", ret, a);
ret = ++b;
printf("ret = %d, b = %d\n", ret, b);
结果如下:
QQ截图20151103220816.png关于 -- 的程序大家自己实现一下,看看会是神马结果。
如果你对运算符还有什么疑问,请修改这些代码,验证你的疑问。通过代码学习永远是最好的方法。
二、赋值语句中的数据类型转换
1. 赋值运算符
这个大家都很熟悉,就是“=”。它的作用是把右边的值或计算结果赋给左边的变量。如:
int a = 0;
int a = b + c;
赋值运算有一种特殊的写法:
int a = 0;
a = a + 5;
a += 5;
a = a - 3;
a -= 3;
第二行和第三行意思相同,第四行和第五行意思相同,可以互相替换。这是一种C语言中的简便写法。
2. 类型转换
类型转换是指不同类型的变量混用时的类型改变。
2.1 隐式类型转换
基本原则:
- 在赋值语句中, 等号右边的值转换为等号左边变量所属的类型
- 不同类型混合计算时,结果类型为数据类型级别较高的
- 所有的浮点预算都是以double进行的
数据类型级别顺序:
char, short < int < float < double
请看下面这段代码:
main()
{
int a, b = 3;
float f = 1.5;
a = f * b; // 整数和浮点类型运算,结果为浮点类型,因为它类型级别高
printf("a = %d\n", a);
a = f; // 把一个浮点类型的变量赋值给整数类型,小数部分会被自动舍去
printf("a = %d\n", a);
}
这段程序的运行结果为:
a = 4
a = 1
其他类型赋值时的隐式转换请大家自己编程实验。
这里有个重点问题需要强调,浮点类型的和整数类型计算时,结果为浮点类型。我们看一个常见问题。
main()
{
float f;
int a = 5;
f = a / 2;
printf("f = %f\n", f);
}
这段程序的运行结果是:
f = 2.0000
原因在于,a是个整数,2也是个整数,它们的计算结果也是整数。此时,就已经舍弃了计算结果中的小数部分。因此,赋值时就自然没有小数部分。
如果我们需要得到f = 2.5怎么办呢?可以这样写:
main()
{
float f;
int a = 5;
f = a / 2.0;
printf("f = %f\n", f);
}
因为整数a和浮点数2.0计算的结果是浮点型(double),因此保留了小数部分。之后再把=右边的double类型转换成左边的float类型。仔细想想,能理解吧。
2.2 强制类型转换
在计算中,我们常常需要主动要求计算机改变变量的类型。这是可以这样做。
(数据类型)(表达式或变量)
按照这种格式写,右边部分的类型就会被强制转换成左边括号中的类型。看看具体代码:
main()
{
float f;
f = 6.6 / 3;
printf("f = %f\n", f);
f = (int)6.6 / 3;
printf("f = %f\n", f);
f = (int)(6.6 / 3);
printf("f = %f\n", f);
}
结果如图所示:
运行结果
重点说一下 f = (int)6.6 / 3;和f = (int)(6.6 / 3);的区别,前者是把6.6转成int型,变成6之后再计算。后者是先计算6.6 / 3,得到结果2.2,之后再强行转换成int型。
今天先说到这里,其他的运算符下次再聊。
很多朋友来信说希望讲一些难度更高的知识点,不知道大家是否觉得这个系列讲得太基础。
我在这里做个简单调查,觉得前几篇有收获的同学请留言告诉我,觉得过于基础的同学请留言说明你们希望讲些什么知识点。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
上一篇:C语言从零开始(五)-常量&变量
下一篇:C语言从零开始(七)-其他运算符