C语言——运算符

C用运算符表示算术运算。

C没有指数运算符,不过,C的标准数学库提供了一个pow()函数用于指数运算。

基本运算符

赋值运算符:=

变量名=变量值 从右到左

左值和变量名的区别:

变量名是一个标识符的名称,左值是一个可变的量。

变量可以是左值,也可以是右值,但是常量绝对不可以是一个左值。

其它赋值运算符:

下面的运算符用右侧的值,根据指定的操作更新左侧的变量:

+=  把右侧的值加到左侧的变量上

-=   从左侧的变量中减去右侧的值

*=  把左侧的变量乘以右侧的值

/=  把左侧的变量除以右侧的值

%=  左侧变量除以右侧值得到的余数

这些组合赋值运算符与普通赋值运算符的优先级相同,都比算术运算符的优先级低。

加法运算符:+

相加的值(运算对象)可以是变量,也可以是常量。

减法运算符:-

左侧数减去右侧数

+和-运算符都被称为二元运算符,即这些运算符需要两个运算对象才能完成操作

符号运算符:-和+

减号还可用于标明或改变一个值的代数符号,这样的负号被称为一元运算符,一元运算符只需要一个运算对象

乘法运算符:*

除法运算符:/

被除数/除数

整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。这使得5除以3很让人头痛,因为实际结果有小数部分。在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断(truncation)。

注意,整数除法会截断计算结果的小数部分(丢弃整个小数部分),不会四舍五入结果。混合整数和浮点数计算的结果是浮点数。实际上,计算机不能真正用浮点数除以整数,编译器会把两个运算对象转换成相同的类型。

C99标准以前,C语言给语言的实现者留有一些空间,让他们来决定如何进行负数的整数除法。一种方法是,舍入过程采用小于或等于浮点数的最大整数。当然,对于3.8而言,处理后的3符合这一描述。但是-3.8 会怎样?该方法建议四舍五入为-4,因为-4 小于-3.8.但是,另一种舍入方法是直接丢弃小数部分。这种方法被称为“趋零截断”,即把-3.8转换成-3。在C99以前,不同的实现采用不同的方法。但是C99规定使用趋零截断。所以,应把-3.8转换成-3。

运算符优先级

乘法和除法的优先级比加法和减法高,所以先执行乘法和除法。如果两个运算符的优先级相同怎么办?如果它们处理同一个运算对象,则根据它们在语句中出现的顺序来执行。对大多数运算符而言,这种情况都是按从左到右的顺序进行(=运算符除外)。

表达式树可以用来表示求值的顺序

最先执行圆括号中的部分。圆括号内部按正常的规则执行。

C语言——运算符_第1张图片

正、负号是一元;加、减号是二元。

结合律只适用于共享同一运算对象的运算符。

其他运算符

sizeof运算符和size_t类型

sizeof运算符以字节为单位返回运算对象的大小(在C中,1字节定义为char类型占用的空间大小。过去,1字节通常是8位,但是一些字符集可能使用更大的字节)。运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。

C 语言规定,sizeof 返回 size_t 类型的值。这是一个无符号整数类型,但它不是新类型。

求模运算符:%

求模运算符(modulus operator)用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数(remainder)。

求模运算符只能用于整数,不能用于浮点数。

作用:控制程序流

如果第1个运算对象是负数,那么求模的结果为负数;如果第1个运算对象是正数,那么求模的结果也是正数。

递增运算符:++

递增运算符(increment operator)执行简单的任务,将其运算对象递增1。该运算符以两种方式出现。第1种方式,++出现在其作用的变量前面,这是前缀模式;第2种方式,++出现在其作用的变量后面,这是后缀模式。两种模式的区别在于递增行为发生的时间不同。

如果n++是表达式的一部分,可将其视为“先使用n,再递增”;而++n则274表示“先递增n,再使用”。

把变量的递增过程放入while循环的条件中有什么好处?

1.使得程序更加简洁。

2.把控制循环的两个过程集中在一个地方。该循环的主要过程是判断是否继续循环,次要过程是改变待测试的元素。

3.生成的机器语言代码效率更高,因为它和实际的机器语言指令很相似。

如果使用前缀形式和后缀形式会对代码产生不同的影响,那么最为明智的是不要那样使用它们。

递减运算符:--

相等运算符:==

逗号运算符:,

逗号运算符把两个表达式连接成一个表达式,并保证最左边的表达式最先求值。逗号运算符通常在for循环头的表达式中用于包含更多的信息。整个逗号表达式的值是逗号右侧表达式的值。

优先级

递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。因此,x*y++表示的是(x)*(y++),而不是(x+y)++。不过后者无效,因为递增和递减运算符只能影响一个变量(或者,更普遍地说,只能影响一个可修改的左值),而组合x*y本身不是可修改的左值。

PS:如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符; 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。

逻辑运算符

逻辑运算符的运算对象通常是关系表达式。!运算符只需要一个运算对象,其他两个逻辑运算符都需要两个运算对象,左侧一个,右侧一个。

&& 与

|| 或

! 非

优先级

!运算符的优先级很高,比乘法运算符还高,与递增运算符的优先级相同,只比圆括号的优先级低。&&运算符的优先级比||运算符高,但是两者的优先级都比关系运算符低,比赋值运算符高。因此,表达式a >b && b > c ||b > d相当于((a > b) && (b > c)) || (b > d)。也就是说,b介于a和c之间,或者b大于d。

尽管对于该例没必要使用圆括号,但是许多程序员更喜欢使用带圆括号的第 2 种写法。这样做即使不记得逻辑运算符的优先级,表达式的含义也很清楚。

逻辑表达式

当且仅当expression1和expression2都为真,expression1 && expression2才为真。

如果 expression1 或 expression2 为真,expression1 || expression2 为真。

如果expression为假,!expression则为真,反之亦然。

求值顺序

逻辑表达式的求值顺序是从左往右。一旦发现有使整个表达式为假的因素,立即停止求值。

条件运算符:?:

C提供条件表达式作为表达if else语句的一种便捷方式,该表达式使用 ?: 条件运算符。该运算符分为两部分,需要 3 个运算对象。(带一个运算对象的运算符称为一元运算符,带两个运算对象的运算符称为二元运算,以此类推。)条件运算符是C语言中唯一的三元运算符。

格式:

expression1?expression2;expression3

如果 expression1 为真(非 0),那么整个条件表达式的值与 expression2的值相同;如果expression1为假(0),那么整个条件表达式的值与expression3的值相同。

if(expression1)

 expression2;

else

 expression3;

地址运算符:&

指针(pointer)是 C 语言最重要的(有时也是最复杂的)概念之一,用于储存变量的地址。前面使用的scanf()函数中就使用地址作为参数。概括地说,如果主调函数不使用return返回的值,则必须通过地址才能修改主调函数中的值。

元&运算符给出变量的存储地址。如果pooh是变量名,那么&pooh是变量的地址。可以把地址看作是变量在内存中的位置。

间接运算符(解引运算符):*

后跟一个指针名或地址时,*给出存储在指针指向地址上的值。

nurse=22;

ptr=&nurse; //指向nurse的指针

val=*ptr; //把ptr指向的地址上的值赋给val

你可能感兴趣的:(C语言,c语言)