(一) 算术运算符
1. 常用算术运算符
算术运算符用于执行程序中的数学运算,C 语言中常用的算术运算符有以下 5 种:
-
加或正值
-
减或负值
-
* 乘
-
/ 除
-
% 取余
-
加法或者正值运算符“+”。作为加法运算符时是双目运算符,也就是需要有 2 个操作数参与运算,例如:a+b、1+3 等。如果作为正值运算符时是单目运算符,例如:+3、+1 等。参与加法运算的操作数可以是字面量、也可以是变量:
#include<stdio.h> int main() { int a=10; int b=20; printf("a+b=%d ",a+b);//变量相加 printf("a+1=%d ",a+1);//变量与常量相加 printf("1+1=%d ",1+1);//字面量与字面量相加 printf("%d ",+a); printf("%d ",+100); getchar(); return 0; }
-
减法或者负值运算符“-”。
-
乘法运算符“*”。
-
除法运算符“/”。
【注意】两个整数相除结果为整数,两个浮点数相除结果为浮点数,如果两个操作数中有一个是浮点数,相除结果为浮点数,示例代码如下:
#include<stdio.h> int main() { int i=5; int j=3; float f = i/j; //i/j 的值赋值给 f float f1=5.0f; float f2=3.0f; float f3=f1/f2; printf("%lf ",f); printf("%lf ",f3); getchar(); return 0; } 运行结果: 1.000000 1.666667
不仅仅是除法,几乎所有运算都是:整数和整数运算结果是整数;整数和小数运算结果是小数;小数和小数的运算结果是小数。
-
求余运算符“%”,属于双目运算符,要求参与运算的两个操作数都必须是整数,求余运算的结果是两个数相除的余数,示例代码如下:
#include<stdio.h> int main() { int a=6; int b=20; printf("%d ",b%a); getchar(); return 0; }
2. 算术表达式
将算术运算符、小括号、操作数连接起来、符合 C 语言规则的式子被称为算术表达式,参与运算的操作数可以是字面量、变量、函数等。例如:a+1、a-b、1*10、20/2、30%4…..等等。
3. 算术运算符优先级
在数学中,算术运算有一套完整的运算规则。在 C 语言中,算术运算同样存在着规则。当算术表达式由多个不同的算术运算符组成时,会按照运算符的优先级进行运算:先乘除后加减、先括号里再括号外,优先级相同,按照自左向右的顺序进行运算,例如:a*10+(100%3)-b/10。
小括号优先级最高,先计算(100%3)。*与/优先级相同,自左向右运算,先计算 a*10,再计算 b/10。+与-优先级相同,自左向右运算,先计算加法,再计算减法。
和数学中一样,可以通过小括号()来改变运算优先级,不过 C 语言中只有(),没有[]、{},()可以嵌套多层。a*(10+100%(3-b)/10);
(二) 赋值运算符和赋值表达式
1. 赋值运算符
赋值运算符“=”,是 C 语言中使用最多的运算符,作用是将一个值(字面量值、变量值、表达式计算结果)复制一份给另一个变量。赋值运算符常见形式:
变量 = 表达式;
a = 1+1; //先计算表达式 1+1,然后将结果值赋给变量 a
变量 = 字面量;
a= 2; //将数值 2 直接赋值给变量 a
变量 = 变量;
a= b; //将变量 b 的值赋值给变量 a
示例代码如下:
#include<stdio.h>
int main()
{
int a;
int b;
int c;
a=20; //将数值 20 赋值给变量 a
b=a-10; //先计算 a-10,然后将计算结果赋值给变量 b
c=a+b; //先计算 a+b,然后将计算结果赋值给变量 c
printf("a=%d
",a);
printf("b=%d
",b);
printf("c=%d
",c);
getchar();
return 0;
}
【注意】
赋值运算符的右边必须是变量,以下写法都是错误的:
20=30; //错误写法
100=a; //错误写法
左边也不能是表达式:a+2=5; 这样也错。
2. 赋值表达式
将赋值运算符、小括号、操作数连接起来、符合 C 语言规则的式子被称为赋值表达式,参与运算的操作数可以是字面量、变量、表达式、函数……等。例如:a= 1+1、a=2、a=a+1、a=b 等等。
b=a+1 的读法是“a+1 的值赋值给 b”,很显然 a=a+1 的读法是“a+1 的值赋值给 a”
3. 赋值运算符优先级
赋值运算符在 C 语言中优先级是最低的。赋值运算都是最后执行,例如:
c=a*10+100%3-b/10;
上述程序中,既有算术运算符,又有赋值运算符。因为赋值运算符优先级是最低的,因此可以将上述程序分为 2 部分看待,先执行=右边的算术表达式,然后将计算结果赋值给=左边的变量 c。
4. 赋值表达式的结果
前面讲过,C 语言中任何一个表达式都会产生一个结果值,赋值表达式也是如此。赋值表达式的结果就是=左边被赋值变量的值,例如:
int a=10;
int c =(a=a+1);
printf("%d
",c);
printf("%d
",c=c+1);
5. 复合赋值运算符
在赋值运算符前加上其他运算符,就可以构成复合运算符。例如:在“=”前加一个“-”就构成复合运算符“-=”。在 C 语言中,常用的复合赋值运算有以下几种:
a+=10; //等价于 a=a+10;
a-=10; //等价于 a=a-10;
a*=10; //等价于 a=a*10;
a/=10; //等价于 a=a/10;
a%=10; //等价于 a=a%10;
(三) 自增(++)、自减(--)运算符
1. 自增(++)运算符
自增运算符“++”由 2 个“+”组成,作用是将变量值增加 1,在 C 语言中,“++”的位置不同表达的意思也不相同,需要分 2 种情况:
++x; //x 先自增 1,然后再参加运算
x++; //x 先参与运算,然后自增 1
示例代码如下:
#include<stdio.h>
int main()
{
int a=1;
a++;
printf("a=%d
",a);
getchar();
return 0;
}
运行结果:
a=2
#include<stdio.h>
int main()
{
int a=1;
++a;
printf("a=%d
",a);
getchar();
return 0;
}
运行结果:
a=2
这样,a++和++a 都相当于 a=a+1,后面讲差别。
2. 自增运算表达式
将自增运算符、小括号、操作数连接起来、符合 C 语言规则的式子被称为自增运算表达式,参与运算的操作数只能是变量,不能是字面量、表达式等。
以下都是错误写法:
++100 //错误写法,不能是字面量
(a+1)++ //错误写法,不能是表达式
前面讲过,“++”的位置不同表达的意思也不相同,下面通过例子来深入了解一下:
#include<stdio.h>
int main()
{
int a=1;
int b=0;
b=a++; //后++
printf("a=%d
",a);
printf("b=%d
",b);
getchar();
return 0;
}
运行结果:
a=2
b=1
#include<stdio.h>
int main()
{
int a=1;
int b=0;
b=++a; //前++
printf("a=%d
",a);
printf("b=%d
",b);
getchar();
return 0;
}
运行结果:
a=2
b=2
我们知道,C 程序中表达式都会返回一个结果值,自增运算表达式也是如此。如果是“变量++”,返回变量自加之前的值;如果是“++变量”,返回变量自加之后的值。因此,上述程序中,b=a++和 b=++a 执行过程等价于以下形式:
b=a++等价于 | b=++a 等价于 |
---|---|
b=a; a=a+1; |
a=a+1; b=a; |
3. 自减(--)运算符
自减运算符“--”由 2 个“-”组成,作用是将变量值减少 1。
也分为 i--、--i 的区别。和++类似。
(四) 关系运算符与关系表达式
1. 关系运算符
关系运算符又称“比较运算符”用于执行程序中的比较运算。C 语言中所有关系运算符都是双目运算符,也就是说需要两个操作数参与运算,常用的关系运算符有以下 6 种:
< 小于
<= 小于或等于大于
= 大于等于
== 等于
!= 不等于
注意<=、>=别写反了。
2. 关系表达式
将关系运算符、小括号、操作数连接起来、符合 C 语言规则的式子被称为关系表达式,
参与运算的操作数可以是字面量、变量、表达式、函数……等。例如:
1>2 //1 是否大于 2
1+1==b //1+1 的结果是否等于变量 b
10*20!=c //10 乘 20 的结果是否不等于变量 c
关系表达式的运算结果只有 2 种:0 或 1。0 表示关系表达式为假,1 表示关系表达式为
真。例如:
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int c=30;
printf("%d
", 1 > 2);
printf("%d
", 5 >= 2);
printf("%d
", a < 2);
printf("%d
", a <= b);
printf("%d
", a+b == c);
printf("%d
", c != a+b);
getchar();
return 0;
}
关系表达式的结果值是整数类型,因此采用%d 格式输出。
printf("%d
",a==b);
printf("%d
",a=b);
不要把 a==b 写成 a=b,a=b 就是赋值表达式
(五) 逻辑运算符与逻辑表达式
1. 逻辑运算符
逻辑运算符用于对程序中的逻辑值进行运算。在日常生活中逻辑值只有 2 种:“真”或“假”。但是 C 语言中没有逻辑类型,为了解决这个问题,采用 0 代表逻辑“假”,非 0代表逻辑“真”。
举个例子:“李小龙是男人”是“真”,“李小龙是德国人”是“假”。
“李小龙是男人 并且 李小龙是德国人”是“假”,“李小龙是男人 或者 李小龙是德国人”是“真”。
C 语言提供的逻辑运算符有以下 3 种:
&& 逻辑与(并且)
|| 逻辑或(或者)
! 逻辑非
逻辑与(&&)和逻辑或(||)都是双目运算符,需要两个操作数才能进行运算。逻辑非(!)是
单目运算符,只需一个操作数即可进行运算。
C 语言逻辑运算符表示的含义如表所示:
运算符 | 名称 | 举例 | 说明 |
---|---|---|---|
&& | 逻辑与 | a&&b | a 和 b 都为真,结果为真,否则为假 |
|| | 逻辑或 | a||b | a 或 b 有一个为真,结果为真。a 和 b 都为假时,结果才为假 |
! | 逻辑非 | !a | a 为假,!a 结果为真;a 为真,!a 结果为假 |
2. 逻辑表达式
将逻辑运算符、小括号、操作数连接起来、符合 C 语言规则的式子被称为逻辑表达式,
参与运算的操作数可以是字面量、变量、表达式……等。例如:
1 && 1
a&&1
a || b
1 ||b
1>2 && 3<4
!a
(六) 条件运算符与条件表达式
条件运算符由“?”与“:”两个符号组成,必须一起使用,是 C 语言中唯一的三目运算符,需要三个操作数才能进行运算。
条件表达式的一般使用形式为:
表达式 1?表达式 2:表达式 3
条件表达式的运算规则为:如果表达式 1 的结果为真,以表达式 2 的值作为整个条件表达式的值,否则以表达式 3 的值作为整个条件表达式的值。例如:
max=a>b?a:b
如果 a>b 为真,将 a 赋值给 max,否则将 b 赋值给 max。a>b?a:b 被称为条件表达式。
一般为了代码结构清晰,建议使用小括号将条件运算表达式包裹起来,比如:max=(a>b?a:b)。
下面通过例子来了解一下条件运算符的使用。
#include<stdio.h>
int main()
{
int a=9;
int b=0;
b=(a>10?888:666);
printf("b=%d
",b);
b=(a>5?888:666);
printf("b=%d
",b);
getchar();
return 0;
}
//使用条件运算符判断数据能否被 3 整除。
#include<stdio.h>
int main()
{
printf("%s
",(6%3==0)?"6 能被 3 整除":"6 不能被 3 整除");
printf("%s
",(5%3==0)?"5 能被 3 整除":"5 不能被 3 整除");
getchar();
return 0;
}
(七) sizeof 运算符
求字节数运算符“sizeof”用于计算变量、字面量、类型所占字节数。该运算符是 C 语言中唯一一个使用单词作为运算符的:
sizeof(类型)、sizeof(字面量)、sizeof(变量)
上述表达式的运算结果为:括号中的类型在当前系统下所占字节数。
下面通过 sizeof 计算 C 语言中常用数据类型所占字节数。
sizeof 计算类型所占字节数
#include<stdio.h>
int main()
{
printf("sizeof(char) =%d
", sizeof(char));
printf("sizeof(int) =%d
", sizeof(int));
printf("sizeof(float) =%d
", sizeof(float));
printf("sizeof(double) =%d
", sizeof(double));
getchar();
return 0;
}