喜迎
春节

运算符以及优先级和结合性


1.算数运算符

需要注意的是 求余运算,必须是int类型才可以

image-20230323220427498

2.运算符的优先级和结合性

普通的数学里面是,先乘除后加减

但是如果一个表达式里面存在多种不同的运算符 , 则需要考虑运算符的优先性和结合性的问题

优先级是用来标识运算符在表达式中的运算顺序,在运算时总是先按运算符的优先级从高到低开始运算,当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序

2.1运算符及其优先关系

image-20230324101123913

image-20230324101138368

image-20230324101200074

image-20230324101212002

image-20230324101226609

image-20230324101238490

image-20230324101249278

image-20230324101257840

再详细一点,附带一个口诀。(网上找的)

括号成员第一; //括号运算符 成员运算符. ->

全体单目第二; //所有的单目运算符比如++、 —、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四; //这个”余”是指取余运算即%

移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七; //即== 和!=

位与异或和位或; “三分天下”八九十; //这几个都是位运算: 位与(&)异或(^)位或(|)

逻辑或跟与; //逻辑运算符:|| 和 &&

十二和十一; //注意顺序:优先级(||) 底于 优先级(&&)

条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和”,”高

逗号运算级最低! //逗号运算符优先级最低

对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。

2.2 结合性

大多数运算符结合方向是“自左至右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a- b 的运算, 再执行加c 的运算。

除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符

同一优先级的看结合性,结合性一般都是从左向右的,举例,从右向左的

例如, int a,b=1,c=2; a=b=c;

a=b=c —> 赋值运算符结合性为从右向左,所以 —> a= (b=c) —> b=c=2 所以 —> a = b =2

**关于结合性,哪里不明白就用一个括号括起来就可以了,根据结合性的顺序。

一些容易出错的优先级问题

不明白的话就去编译器上代码敲出来

image-20230324103437003

3.逗号表达式

逗号表达式注意两个基本知识:

  1. 逗号表达式的运算顺序是从左向右运算
  2. 逗号表达式的值取逗号中最右表达式的值
    int x ,a ;
    x = ((a=3*5,a*4),a+5) ;
// 最后的结果 x = 20 

这个逗号表达式从左向右运算先计算a=3 5这是个赋值语句,处理a=3 5=15

再计算a 4,此时a=15,所以a 4=60,但是注意这个表达式并没有对a赋值,仅仅是一个乘法运算
根据逗号表达式的值取逗号中最右表达式的值的原则,(a=3 5,a 4)的值为60

再看a+5,
之前运算(a=3 5,a4)时,a已经被赋值为15,所以这里a+5=15+5=20
所以a+5这个表达式的值为20

再根据逗号表达式的值取逗号中最右表达式的值的原则,
表达式(a=3 5,a4),a+5 的值即为a+5的值,也就等于20了

4.关于Printf函数中的坑

printf函数在不同的环境下,运行顺序是不一样的

Windows:执行的顺序是从右到左的

    int i = 1 ;

    while(i <= 100)
    {

//        printf("%d的平方是%d\n",i-1,square(i++)) ;
        printf("%d %d\n",i-1,i++) ; 
    }

例如上面的这个案例

那个i-1刚开始一直理解不明白,后来才发现printf中的运行顺序是从右到左的,并不是直接的理解从左到右

这点需要注意。

除了考试或者考察你的这个知识点,其余时候不会有这种错误的示范的,这种写法是不规范的

==注意==

并不是只有printf该函数是这样的,我上面没有描述清楚,


文章作者: ljhaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ljhaa !
评 论
 上一篇
结构设计的坑
结构设计的坑
1.if语句常见的坑1.1 else悬挂else始终与最接近它的匹配 所以下面的这个else匹配的是if(isRain)的,并不是isFree的。 if (isFree == 'Y') if (isRain == 'Y')
2023-04-18
下一篇 
c语言的输入输出
c语言的输入输出
0.常见的输入函数 scanf() 可输入多种类型的数据 getchar() 输入单个字符 getche() 输入单个字符 getch() 输入单个字符 gets() 获取一行数据,并作为字符串处理 1.printf用法详解
2023-04-18
  目录