C语言编程0基础学习历程(4)—— C的运算与表达式
目录
在C语言中由算数运算符与其操作数组成的表达式称为算术表达式。
1、运算符类别
其中只需要一个操作数的运算符称为一元运算符,需要两个操作数的运算符称为二元运算符,需要三个操作数的运算符称为三元运算符(或三目运算符)。条件运算符是C语言中唯一一个三目运算符。
2、除法运算
不同于数学运算,C语言中分为整数除法和浮点数除法两大类,前者所得结果为余数可能不为零时整数商,后者为余数为零的浮点数商。举个例子,12 / 5结果为2 ,但 12.0 / 5 结果为2.400000。
例:
#include <stdio.h>
int main()
{
int a=12;
float b=12.0;
a=a/5;
b=b/5;
printf("%d\n%f",a,b);
return 0;
}
运行结果:
3、求余运算
在C语言中求余运算仅限于两个操作数为整数的情况,浮点数不可参与求余运算。求余运算的结果为二者整除后的余数,求余运算常被用作取模,以限定数据范围。
4、复合的赋值运算符
复合的赋值运算符即为简写的赋值方式,这样书写不仅简洁,而且执行效率更高一些。
注:复合运算符之间不应存在空格。
5、增一和减一运算符
对变量实行增一或减一是一种很常见的操作,为此C语言专门提供了执行这种功能的运算符,即增一运算符(自增运算符)和减一运算符(自减运算符)。其操作数具有左值性质,必须是变量,不可为常量或表达式。
当自增(自减)运算符写在变量前时称为前缀运算符,是在变量使用之前先对其进行加一(减一)操作,写在后面即为后缀运算符,是在变量是使用之后对其进行加一(减一)操作。此操作生成的代码比等价的赋值运算生成的代码执行效率更高一些。
例:
#include <stdio.h>
int main()
{
int a=1;
int b=1;
printf("%d\n%d\n",a++,++b);
printf("%d\n%d\n",a,b);
return 0;
}
运行结果:
6、 宏常量与宏替换
众所周知,π是一个常量,其大小约为3.14159,常用于圆类的面积计算中,假如我们需要写一个有关计算圆面积和周长的程序,其中多次需要调用π这个数的数值,我们应该怎么办?
一般的想法是在每处π出现的地方写入3.14159,但如果我们想改变π的精度呢,难道要一个一个进行修改么?这未免也太麻烦了。那么如何解决这个问题呢?这就要用到宏常量和宏替换了。
宏常量也称为符号常量,是指用一个标识符号来表示的常量。其一般形式为:#define 标识符 字符串 (最后没有分号结尾)
例:
#include <stdio.h>
#define PI 3.14159
int main()
{
int a=1;
int b=2;
double areaA=a*a*PI;
double areaB=b*b*PI;
printf("%lf,%lf\n",areaA,areaB);
return 0;
}
运行结果:
宏定义中的标识符被称为宏名,将程序中出现的宏名替换成字符串的过程叫做宏替换。
7、const常量
使用宏常量最大的问题是,宏常量没有数据类型,编译时仅仅是进行简单的字符串替换,而字符串替换时常遇到意想不到的问题。为解决这个问题,就要引入const常量。
只要将const类型修饰符放在类型名之前,即可将类型名后的标识符声明为具有该类型的const常量。由于编译器将其放在只读存储区,不允许在程序中改变其值,因此const常量只允许在定义时赋初值。
例:
#include <stdio.h>
const double PI=3.14159;
int main()
{
int a=1;
int b=2;
double areaA=a*a*PI;
double areaB=b*b*PI;
printf("%lf,%lf\n",areaA,areaB);
return 0;
}
运行结果:
8、自动类型转换
请读者思考一下这样的问题,如果两种不同类型的操作数进行运算,运算结果会是什么类型呢?
C编译器会将所有操作数转换为取值范围较大的操作数类型,称为类型提升。规则如下:
(能力有限,关系图不甚美观,望谅解)
如果是赋值时遇到左右侧类型不同,则将右侧表达式的值转换为左侧变量的类型。当然,由小到大的进行类型转换时是合理的,但如果反过来将出现一些问题。
附:
表1
左侧变量类型 | 右侧表达式类型 | 可能丢失的信息 |
---|---|---|
singed char | char | 当值大于127时,转换结果为负数 |
char | short | 高8位 |
char | int (16位) | 高8位 |
char | int (32位) | 高24位 |
char | long | 高24位 |
short | int(16位) | 无 |
short | int(32位) | 高16位 |
int(16位) | long | 高16位 |
int(32位) | long | 无 |
int | float | 小数部分 |
float | double | 精度 |
double | long double | 精度 |
9、强制类型转换
格式:(类型)表达式。使用强制类型转换可以明确表示程序打算执行何种类型转换。