自学C语言--C语言的运算符、表达式和语句···笔记

一、例子:初识while循环

代码使用一对花括号来标出while循环的范围。花括号之间的内容就是要被重复执行的内容。花括号以及被花括号括起来的部分被称为块。

二、基本运算符

包括:=、+、-、*、/  ; 特别地:pow()函数用于指数运算。

(1)、赋值运算符(=)

数据对象:用于存储值的数据存储区域。

对象:实际的数据存储。

左值:用于标识或定位存储位置的标签。

可修改的左值:用于标识可修改的对象。即:对象定位值。

右值:能赋值给可修改左值的量,且本身不是左值。

e.g.   a=2

(2)、加法运算符(+)

运算对象可以是变量,也可以是常量。

(3)、减法运算符(-)

用于减法运算,使其左侧的数减去右侧的数。

注:加法和减法运算符都被称为二元运算符。

(4)、符号运算符(-和+)【一元运算符】

减号可以用于标明或改变一个值的代数符号。

e.g. a=-3

       b=-a

       b=3

(5)、乘法运算符(*)

例子:指数增长

#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
(6)、除法运算符(/)

整数除法的结果是整数;浮点数除法是浮点数。

#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

,

逗号运算符

表达式,表达式,…

左到右

上表中可以总结出如下规律:

  1. 结合方向只有三个是从右往左,其余都是从左往右。
  2. 所有双目运算符中只有赋值运算符的结合方向是从右往左。
  3. 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
  4. C语言中有且只有一个三目运算符。
  5. 逗号运算符的优先级最低,要记住。
  6. 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。

四、其他运算符

(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;

你可能感兴趣的:(自学C语言,c语言,笔记,开发语言)