1.算数运算
与数学一样,C语言中的算数运算也有运算符:
- | 取相反数 |
* | 乘法 |
/ | 除法 |
% | 求余 |
+ | 加法 |
- | 减法 |
(1)*乘法
乘号*在C语言中是不可省略且不可用其他符号代替的,以下代码是错误示范
#include <stdio.h>
int main()
{
int a=2;
int b=3;
int c=ab;
printf("%d",c);
}
报错如下:
加上*号编译器才认得出乘法
(2)/除法
C语言中整数除以整数的结果会被强制转换为整数(即取整),只有实数之间的除法才能产生实数
示例代码及结果如下
#include <stdio.h>
int main()
{
int a=3;
int b=2;
printf("%f",a/b);
}
明显地,出现了错误(一般结果出现0.0000..就意味着程序中有一步或多步要输入输出的数据与控制条件不符),a/b的结果不是实型数据,我们修改一下
#include <stdio.h>
int main()
{
int a=3;
int b=2;
printf("%d",a/b);
}
结果如下
由此可知,输出结果不是1.5而成了1,这就是强制取整的结果
但我们想要的是1.5而不是1,肿么办?这时就要进行类型转换
(3)类型转换
A.自动类型转换
自动类型转换在初始化、赋值时进行,若赋值运算符左侧变量的类型与右侧数据的类型不一致,则自动发生类型转换,将右侧数据转换为左侧变量的类型
以下用自动类型转换解决上面的问题
#include <stdio.h>
int main()
{
double a=3;
double b=2;
printf("%.1f",a/b);
}
3和2是整型数据,而a和b都是实型变量,在初始化后3和2都被自动转换为了实型数据3.00000 和2.000000,a/b的运算结果也就能以实型数据1.5输出了
自动类型转换具有发生数据信息丢失、数值溢出错误的隐患,将取值范围小的类型转换为取值范围大的类型是安全的,否则推荐使用强制类型转换以表明转换意图,便于查错
B.强制类型转换
通过(类型)变量的格式可以将变量的数值强制转换为任意类型,号称C语言的倚天剑
以下用强制类型转换解决上面的问题
#include <stdio.h>
int main()
{
int a=3;
int b=2;
printf("%.1f",float(a)/float(b));
}
float(a)将a的整型数据强制转换为实型数据,float(b)同理,使变量a和b以实型数据参与运算,结果就能以实型1.5输出
注:强制类型转换转换的是变量参与运算的值,而不是变量本身的值和类型
以下代码和结果能揭示转换的本质
#include <stdio.h>
int main()
{
int a=3;
int b=2;
printf("%.1f",float(a)/float(b));
printf("a=%f,b=%f",a,b);
printf("a=%d,b=%d",a,b);
}
很明显,转换后变量的类型还是整型,其值还是整型数据3和2,改变的只有参与运算的值
(4)%求余
求余就是求两数相除后产生的余数,左侧为被除数,右侧为除数
求余运算的两参与数必须是整型数据,不能对两实数求余(既没意义也求不出结果)
(5)迭代与简写运算符
变量作为已开辟的内存,其值可以不断改变的特性产生了迭代方法,即对本身的旧值操作后产生本身的新值,如下代码所示
#include <stdio.h>
int main()
{
int a=5;
a=2*a;
printf("%d",a);
}
a=2*a这步意味着将2*(a的旧值)赋值给a,2*(a的旧值)成为a的新值,也就是10
这种迭代步骤可简写,如下:
简写符 | 等价式 |
a++;(自增) | a=a+1; |
a - -;(自减) | a=a-1; |
a*=k; | a=a*k;; |
a/=k; | a=a/k; |
a+=k; | a=a+k; |
a-=k; | a=a-k; |
a%=k; | a=a%k; |
(6)运算优先级
以下表格从上到下运算符的优先级递减
++和-- |
-(取反) |
*和/ |
+和- |
()内的内容优先运算,可改变运算优先级
我们看这组代码和运行结果
#include <stdio.h>
int main()
{
int a = 2;
a = (5 - 2*a) * 3;
printf("%d", a);
}
括号内的运算说明*比-优先级高,括号外的运算说明()能改变优先级,这与数学中的运算是一样的
2.幻数的处理
很平常的问题,我们要求圆的周长,怎么处理,C语言中并不能直接使用,也没有对这种幻数(即有现实意义的常用常量)的规定,难不成天天写3.1415926?这是不行的,以下是解决方法
(1)宏常量定义
宏常量在程序的开头设定
格式:#define 幻数标识符 幻数值的字符串
#include <stdio.h>
#define Pai 3.1415926
(2)const(固定)常量定义
const 常量在任意处都能设定
格式:const 对应变量类型 幻数标识符=幻数值的字符串;
const double Pai=3.1415926;
定义后就能直接用Pai来代替3.1415926啦
应用例子如下:
#include <stdio.h>
#define Pai 3.1415926
int main()
{
double R=5;
double circumference=0;
circumference=2*Pai*R;
printf("%lf",circumference);
}
#include <stdio.h>
int main()
{
const double Pai=3.1415926;
double R=5;
double circumference=0;
circumference=2*Pai*R;
printf("%lf",circumference);
}
结果均为正确的31.415926!
小贴士:一定要遵循宏常量的定义格式!不能多加任何符号,编译器无法识别其类型,程序会产生严重错误!下面是常见的错误格式:
#define Pai=3.1415926
#define Pai:3.1415926
#define Pai 3.1415926;