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。
运算符优先级
乘法和除法的优先级比加法和减法高,所以先执行乘法和除法。如果两个运算符的优先级相同怎么办?如果它们处理同一个运算对象,则根据它们在语句中出现的顺序来执行。对大多数运算符而言,这种情况都是按从左到右的顺序进行(=运算符除外)。
表达式树可以用来表示求值的顺序
最先执行圆括号中的部分。圆括号内部按正常的规则执行。
正、负号是一元;加、减号是二元。
结合律只适用于共享同一运算对象的运算符。
其他运算符
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
文章来源:https://uudwc.com/A/LaW2V
文章来源地址https://uudwc.com/A/LaW2V