简单的算术运算与表达式

C语言编程0基础学习历程(5)—— 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 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、强制类型转换

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章