• 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。

    运算符优先级

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

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

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

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

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

    其他运算符

    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++ 泛型编程之类模板
    Abstract Factory 抽象工厂模式简介与 C# 示例【创建型】
    Flink 内存模型
    dubbo2.7时间轮的应用
    离散优化算法和连续优化算法
    CLI、CLR、CTS、CLS
    Kubernetes:(二)了解k8s组件
    OCR文字识别软件对于硬件的哪方面需求较高?
    数据库的操作
    35岁危机来临前,程序员如何未雨绸缪?
  • 原文地址:https://blog.csdn.net/weixin_65951505/article/details/133267051