代码使用一对花括号来标出while循环的范围。花括号之间的内容就是要被重复执行的内容。花括号以及被花括号括起来的部分被称为块。
包括:=、+、-、*、/ ; 特别地:pow()函数用于指数运算。
数据对象:用于存储值的数据存储区域。
对象:实际的数据存储。
左值:用于标识或定位存储位置的标签。
可修改的左值:用于标识可修改的对象。即:对象定位值。
右值:能赋值给可修改左值的量,且本身不是左值。
e.g. a=2
运算对象可以是变量,也可以是常量。
用于减法运算,使其左侧的数减去右侧的数。
注:加法和减法运算符都被称为二元运算符。
减号可以用于标明或改变一个值的代数符号。
e.g. a=-3
b=-a
b=3
例子:指数增长
#include
#define SQUARES 64
int main(void)
{
const double CROP = 2E16;
double current,total;
int count = 1;
printf("square grains total ");
printf("fraction of \n");
printf(" added grains ");
printf("world total\n");
total = current = 1.0;
printf("%4d %13.2e %12.2e %12.2e\n",count,current,total,total/CROP);
while (count
整数除法的结果是整数;浮点数除法是浮点数。
#include
int main(void)
{
printf("integer division: 5/4 is %d \n", 5/4);
printf("integer division: 6/3 is %d \n", 6/3);
printf("integer division: 7/4 is %d \n", 7/4);
printf("floating division: 7./4. is %1.2f \n", 7./4.);
printf("mixed division: 7./4 is %1.2f \n", 7./4);
return 0;
}
注:浮点数除以整数还是浮点数,但要避免混合使用。
对于负数的整数除法,采用直接丢弃小数部分,即:趋零截断。
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
---|---|---|---|---|---|
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
|
() |
圆括号 |
(表达式) |
|||
. |
成员选择(对象) |
对象.成员名 |
|||
-> |
成员选择(指针) |
对象指针->成员名 |
|||
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
(类型) |
强制类型转换 |
(数据类型)表达式 |
|||
++ |
递增运算符 |
++变量名 |
单目运算符 |
||
-- |
递减运算符 |
--变量名 |
单目运算符 |
||
* |
取值运算符 |
*指针变量 |
单目运算符 |
||
& |
取地址运算符 |
&变量名 |
单目运算符 |
||
! |
逻辑非运算符 |
!表达式 |
单目运算符 |
||
~ |
按位取反运算符 |
~表达式 |
单目运算符 |
||
sizeof |
长度运算符 |
sizeof(表达式) |
|||
3 |
/ |
除 |
表达式 / 表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 |
双目运算符 |
||
% |
余数(取模) |
整型表达式%整型表达式 |
双目运算符 |
||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 |
双目运算符 |
||
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
变量>>表达式 |
双目运算符 |
||
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 |
双目运算符 |
||
< |
小于 |
表达式<表达式 |
双目运算符 |
||
<= |
小于等于 |
表达式<=表达式 |
双目运算符 |
||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!= 表达式 |
双目运算符 |
||
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
|
/= |
除后赋值 |
变量/=表达式 |
|||
*= |
乘后赋值 |
变量*=表达式 |
|||
%= |
取模后赋值 |
变量%=表达式 |
|||
+= |
加后赋值 |
变量+=表达式 |
|||
-= |
减后赋值 |
变量-=表达式 |
|||
<<= |
左移后赋值 |
变量<<=表达式 |
|||
>>= |
右移后赋值 |
变量>>=表达式 |
|||
&= |
按位与后赋值 |
变量&=表达式 |
|||
^= |
按位异或后赋值 |
变量^=表达式 |
|||
|= |
按位或后赋值 |
变量|=表达式 |
|||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
上表中可以总结出如下规律:
- 结合方向只有三个是从右往左,其余都是从左往右。
- 所有双目运算符中只有赋值运算符的结合方向是从右往左。
- 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
- C语言中有且只有一个三目运算符。
- 逗号运算符的优先级最低,要记住。
- 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。
(1)、sizeof()运算符
sizeof 运算符以字节为单位返回运算对象的大小
运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。
(2)、求模运算符(modulus operator)%
用于整数运算,不能用于浮点数运算。
sizeof返回size_t类型的值。这是一个无符号整数类型。
负数求模如何进行? C99规定“趋零裁断”之前,该问题的处理方法很多。但自从有了这条规则之后,如果第1个运算对象是负数,那么求模的结果为负数;如果第1个运算对象是正数,那么求模的结果也是正数。
(3)、递增运算符++
执行简单的任务,将其运算对象递增1。
该运算符以两种方式出现。第1种方式,++出现在其作用的变量前面,这是前缀模式。第2种方式,++出现在其作用的变量后面,这是后缀模式。两种模式的区别在于递增行为发生的时间不同。
++a与a++的区别
#include
int main(void)
{
int a = 1, b = 1;
int a_post, pre_b;
a_post = a++; // value of a++ during assignment phase
pre_b = ++b; // value of ++b during assignment phase
printf("a a_post b pre_b \n");
printf("%1d %5d %5d %5d\n", a, a_post, b, pre_b);
return 0;
}
运行结果:
a a_post b b_post
2 1 2 2
注:前缀,使用b的值之前。递增b;后缀,使用a的值之后,递增a。
单独使用递增运算符前缀和后缀一样。
(4)、递减运算符--
同上。
注:若n++是表达式的一部分,则“先使用n,再递增”;而++n则表示“先递增n,再使用”。
C语言中声明不是表达式语句。
副作用是对数据对象或文件的修改。序列点是程序执行的点。
类型升级:从较小类型转换成较大类型。其中,char和short类型自动升级为int类型,float类型会被自动升级为double类型。
类型降级:从较大类型转换成较小类型。
强制类型转换:在某个量的前面放置用圆括号括起来的类型名,该类型名是希望转换成的目标类型。
强制类型转换运算符:圆括号和它括起来的类型名。
e.g. mice= 1.6 + 1.7;
mice= (int) 1.6+ (int) 1.7;