C语言编程0基础学习历程(4)—— C的运算与表达式

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、复合的赋值运算符

复合的赋值运算符即为简写的赋值方式,这样书写不仅简洁,而且执行效率更高一些。

注:复合运算符之间不应存在空格。

传送门(表7第14行包含常见的复合的赋值运算符)

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编译器会将所有操作数转换为取值范围较大的操作数类型,称为类型提升。规则如下:

char
int
short
unsigned int
long
unsigned long
double
float
long double

(能力有限,关系图不甚美观,望谅解)

如果是赋值时遇到左右侧类型不同,则将右侧表达式的值转换为左侧变量的类型。当然,由小到大的进行类型转换时是合理的,但如果反过来将出现一些问题。
附:
表1

左侧变量类型右侧表达式类型可能丢失的信息
singed charchar当值大于127时,转换结果为负数
charshort高8位
charint (16位)高8位
charint (32位)高24位
charlong高24位
shortint(16位)
shortint(32位)高16位
int(16位)long高16位
int(32位)long
intfloat小数部分
floatdouble精度
doublelong double精度
9、强制类型转换

格式:(类型)表达式。使用强制类型转换可以明确表示程序打算执行何种类型转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽路星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值