本节大纲
一、数据类型介绍
二、signed和unsigned
三、数据类型和取值范围
四、变量
五、算术操作符:+、-、*、\、%
六、赋值操作符和复合赋值符
七、单目操作符:++、--、+、-
八、强制类型转换
五、算术操作符:+、-、*、/、%
当程序员写代码的时候,一定会涉及到计算。所以C语言为了方便运算,提供了一系列操作符,其中有一组操作符就称为算术操作符。分别为:+、-、*、/、%,这五个算术操作符都是双目操作符。
上面所提及的操作符在有一些教材上也称为运算符,这两者只是翻译不同,含义是一样的。
(一)、+ 和 -
+ 和 - 很好理解,就是我们常见用来实现加法和减法。
并且在使用时我们很容易观察到,+ 和 - 都是有两个操作数的,位于操作符(运算符)两端的就是他们的操作数,而这种左右两端各有一个操作数的操作符叫做双目操作符。
下面这段代码简单演示了 + 和 - 这两个操作符的使用方式:
#include <stdio.h>
int main()
{
int x = 4 + 22;
int y = 61 - 23;
printf("x=%d\n", x);
printf("y=%d", y);
return 0;
}
(二)、*
运算符 * 用来实现乘法运算。
下面这段代码简单演示了 * 这个操作符的使用方式:
#include <stdio.h>
int main()
{
int z = 5;
printf("num = %d", z * z);
return 0;
}
(三)、/
运算符 / 用来实现乘法运算。
如果操作符的两端如果均为整数,执行的就是整数除法,得到的结果也会是整数,没有小数也没有余数。即使我们将变量类型定义为 float (浮点数)类型,如果操作符两边均为整数,那么得到的结果也会是一个整数。
如果我们希望得到一个浮点数的结果,那么两个操作数必须有一个是浮点数,此时C语言就会进行浮点数除法。
观察下面这段代码,展现了关于 / 操作符的基本操作以及整数除法、浮点数除法的基本规则:
#include <stdio.h>
int main()
{
int a = 6 / 4;
float b = 6 / 4;
float c = 6.0 / 4;
float d = 6 / 4.0;
printf("a = %d\n", a);
printf("b = %f\n", b);
printf("c = %f\n", c);
printf("d = %f\n", d);
return 0;
}
这段代码的运行结果为:
所以我们可以进行一些简单的计算练习:
#include <stdio.h>
int main()
{
int score = 5;
score = (score / 20) * 100;
return 0;
}
对于上面这段代码,如果认为score经过计算之后等于25,那么你的结果就错了,实际上score的值等于0,这就是因为(score / 20)是一个整除,结果为0。如果想使score得25,那我们需要将代码修改如下:
#include <stdio.h>
int main()
{
int score = 5;
score = (score / 20.0) * 100;
return 0;
}
这样(score / 20.0)就变成了一个浮点数除法,也就使score的值经过计算之后得到了25。
此外还有一点需要提醒大家注意的,如果我们在定义变量的时候出现了如下语句:
int score = 5.5;
这违反了我们对int类型的定义,此时编译器会自动忽略小数点后部分,将score赋值为5,但往往此时编译器就会报错。
(四)、%
操作符 % 表示求模(取余)运算,即返回两个整数相除的余数。但是注意这个操作符只能用于整数,不能用于浮点数。
负数求模的规则是:结果的正负号由第一个运算符的正负号决定。
下面这段代码简单演示了 % 这个操作符的使用方式:
#include <stdio.h>
int main()
{
printf("%d\n", 6 % 4);
printf("%d\n", 11 % -5);
printf("%d\n", -11 % -5);
printf("%d\n", -11 % 5);
return 0;
}
这段代码的运行结果为:
六、赋值操作符和复合赋值符
在变量创建的时候给一个初始值叫做初始化,在变量创建好后,再给一个值,叫做赋值。赋值操作符 = 是一个随时可以给变量赋值的操作符,就像下面这段代码,展示了什么叫做初始化,什么叫做赋值以及赋值操作符如何给变量赋值:
#include <stdio.h>
int main()
{
int a = 0; //这是初始化,将整型变量a初始化值0
a = 10; //这是赋值,将a赋值10,这里就是使用了赋值操作符
a = 20; //这也是赋值,将变量a的值由10更改为20
return 0;
}
(一)、连续赋值
赋值操作符支持连续赋值,即将几个不同变量写在同一行赋值,赋值的时候是从右向左依次赋值。C语言虽然支持这种连续赋值,但是写出的代码不容易理解,同时调试的时候也容易出现问题,所以建议还是拆开来写,这样方便观察代码的执行细节,下面这段代码展现了连续赋值的基本语法以及将其展开后的效果:
#include <stdio.h>
int main()
{
int b = 3;
int c = 5;
int d = 0;
d = c = b + 3; //这就是连续赋值,从右向左依次赋值
//这条连续赋值语句等价于下面这两条语句
c = b + 3;
d = c;
return 0;
}
(二)、复合赋值符
在程序员写代码的时候,往往会运用到一个变量的自增、自减、自乘等一系列操作。那么我们往往需要编写以下代码:
int x = 10;
x = x + 3;
x = x - 2;
此时C语言给出了一种更为简单、便捷的写法可以达成相同的效果,便是复合赋值符,具体使用如下:
int x = 10;
x += 3; //等价于x = x + 3;
x -= 2; //等价于x = x - 2;
同理我们可以实现一系列自乘、自除、自取余的操作。
C语言中提供了丰富的复合赋值符号来方便我们编写,具体有:+= 、-= 、*= 、/= 、%= 、>>= 、<<= 、&= 、|= 、^= 。部分的操作符我们还不了解其含义,在后面的内容中会逐渐涉及。
七、单目操作符:++ 、-- 、+ 、-
前面介绍的操作符都是双目操作符,因为其左右两边各有一个操作数。但是在C语言当中还有一些操作符只有一个操作数,被称为单目操作符。++ 、-- 、 + 、- 就是一组单目操作符。下面我们就来在学习这四个单目操作符。
(一)、++ 和 --
++ 是一种自增的操作符,细致又分为前置++和后置++ ; -- 是一种自减的操作符,细致又分为前置--和后置--。
1、前置++
#include <stdio.h>
int main()
{
int a = 10;
int b = ++a;
printf("a = %d\nb = %d\n", a, b);
return 0;
}
++ 的操作数是a,此时++是在a的前面的,这就是前置++,而前置++的计算公式是先自增,再使用。所以对于上面这段代码,a先自增1变成11,再赋值给b,那么此时a和b的值就都变成11了。这段代码变成我们好理解的样子是:
#include <stdio.h>
int main()
{
int a = 10;
int b = 0;
a = a + 1;
b = a;
printf("a = %d\nb = %d\n", a, b);
return 0;
}
2、后置++
#include <stdio.h>
int main()
{
int a = 10;
int c = a++;
printf("a = %d\nc = %d\n", a, c);
return 0;
}
++ 的操作数是a,此时++是在a的后面的,这就是后置++,而后置++的计算公式是先使用,再自增。所以对于上面这段代码,a先赋值给b,使b的值成为10,a再进行自增运算成为11。这段代码变成我们好理解的样子是:
#include <stdio.h>
int main()
{
int a = 10;
int c = a;
a = a + 1;
printf("a = %d\nc = %d\n", a, c);
return 0;
}
3、前置-- 和后置--
理解了前置++和后置++之后,前置-- 和后置--就很好理解了,只是把自增运算改为自减运算而已。前置-- 的计算法则是先自减,再使用;后置-- 的计算法则是先使用,后自减。下面我用一个代码来展示前置-- 和后置-- 的使用:
int main()
{
int x = 10;
int y = --x; //前置--,先自减,再使用
int z = x--; //后置--,先使用,再自减
printf("x = %d\ny = %d\nz = %d", x, y, z);
return 0;
}
这段代码的运行结果为:
(二)、+(正号) 和 -(负号)
运算符 + 对正负值没有任何影响,是一个完全可以省略的运算符号,当然我们在程序中写了也不会报错。而运算符 - 可以用来改变一个值的正负号,负数的前面加上 - 就会得到一个正数,正数的前面加上一个 - 会得到一个负数。因为他们仅有一个操作数,因此也是单目操作符。
下面这段代码我展现了我们常见的用到 + 和 - 的情况:
#include <stdio.h>
int main()
{
int a = +10; //等价于int a = 10;
int b = -a;
int c = -10;
int d = -c;
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
printf("d = %d\n", d);
return 0;
}
这段代码的运行结果为:
八、强制类型转换
在操作符中还有一种特殊的操作符是强制类型转换,语法形式很简单。处理问题的情景我们上面也有提及:
#include <stdio.h>
int main()
{
int num = 3.14;
//num我们定义的类型是整型,但是3.14是一个double类型
//此时打印的话编译器会警告,输出的结果我们上面提及过为3
printf("num = %d", num);
return 0;
}
为了消除编译器的警告,我们可以使用强制类型转换,具体使用方式如下:
int num = (int)3.14;
这样就把3.14的float类型强制转换为了int类型,代码的输出结果不会改变。当然,强扭的瓜不甜,我们使用强制转化类型往往是在万不得已的情况下使用,如果不需要强制转化类型就可以实现代码,这样自然是更好的。