文档库 最新最全的文档下载
当前位置:文档库 › c语言运算符优先级

c语言运算符优先级

c语言运算符优先级
c语言运算符优先级

c语言运算符优先级

c语言运算符优先级(一)

Turbo C的运算符非常丰富, 主要分为三大类: 算术运算符, 关系运算符与逻辑运算符, 按位运算符。除此之外, 还有一些用于完成特殊任务的运算符。下面分别进行介绍。

5.1 算术运算符

Turbo C的算术运算符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

操作符作用

────────────────────────────

+ 加, 一目取正

- 减, 一目取负

* 乘

/ 除

% 取模

-- 减1

++ 加1

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

一、一目和二目操作

一目操作是指对一个操作数进行操作。例如: -a是对a进行一目负操作。

二目操作(或多目操作)是指两个操作数(或多个操作数)进行操作。

在Turbo C中加、减、乘、除、取模的运算与其它高级语言相同。需要注意的是除法和取模运算。

例如:

15/2 是15除以2商的整数部分7

15%2 是15除以2的余数部分1

对于取模运算符"%", 不能用于浮点数。

另外, 由于Turbo C中字符型数会自动地转换成整型数, 因此字符型数也可以参加二目运算。

例如:

main()

{

char m, n; /*定义字符型变量*/

m='c'; /*给m赋小写字母'c'*/

n=m+'A'-'a'; /*将c中的小写字母变成大写字母'B'后赋给n*/

...

}

上例中m='c'即m=98, 由于字母A和a的ASCII码值分别为65和97。这样可以将小写字母变成大写字母, 反之, 如果要将大写字母变成小写字母, 则用c+ 'a'-'A'进行计算。

二、增量运算

在Turbo C中有两个很有用的运算符, 在其它高级语言中通常没有。这两个运算符就是增1和减1运算符"++"和"--", 运算符"++"是操作数加1, 而"--" 则是操作数减1。

例如:

x=x+1 可写成x++, 或++x

x=x-1 可写成x--, 或--x

x++(x--)与++x(--x)在上例中没有什么区别, 但x=m++和x=++m却有很大差别。

x=m++ 表示将m的值赋给x后, m加1。

x=++m 表示m先加1后, 再将新值赋给x。

三、赋值语句中的数据类型转换

类型转换是指不同类型的变量混用时的类型改变。

在赋值语句中, 类型转换规则是:

等号右边的值转换为等号左边变量所属的类型。

例如:

main()

{

int i, j; /*定义整型变量*/

float f, g=2.58; /*定义浮点型变量*/

f=i*j; /*i与j的乘积是整型数, 被转换成为浮点数赋给f*/

i=g; /*g中的浮点型数转换成为整型数赋给i*/

...

}

由于Turbo C按上述数据类型转换规则, 因此在作除法运算时应特别注意。

例如:

main()

{

float f;

int i=15;

f=i/2;

}

上面程序经运行后, f=7并不等于准确值7.5。正确的程序应该是:

main()

{

float f;

int i=15;

f=i/2.0;

}

也可直接将i定义为浮点数。

5.2 关系运算符和逻辑运算符

一、逻辑运算符

逻辑运算符是指用形式逻辑原则来建立数值间关系的符号。

Turbo C的逻辑运算符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

操作符作用

─────────────────────────────

&& 逻辑与

|| 逻辑或

! 逻辑非

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

二、关系运算符

关系运算符是比较两个操作数大小的符号。

Turbo C的关系运算符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

操作符作用

─────────────────────────────

> 大于

>= 大于等于

< 小于

<= 小于等于

== 等于

!= 不等于

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

关系运算符和逻辑运算符的关键是真(true)和假(false)的概念。Turbo C中true可以是不为0的任何值, 而false则为0。使用关系运算符和逻辑运算符表达式时, 若表达式为真(即true)则返回1, 否则, 表达式为假(即false), 则返回0。

例如:

100>99 返回1

10>(2+10) 返回0

!1&&0 返加0

对上例中表达式!1&&0, 先求!1和先求1&&0将会等于出不同的结果,那么何者优先呢? 这在Turbo C中是有规定的。有关运算符的优先级本节后面将会讲到。

5.3 按位运算符

Turbo C和其它高级语言不同的是它完全支持按位运算符。这与汇编语言的位操作有些相似。

Turbo C中按位运算符有:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

操作符作用

────────────────────────────

& 位逻

| 位逻辑或

|= 运算按位或,且进行赋值运算

^ 位逻辑异或

- 位逻辑反

>> 右移

<< 左移

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用。

关系运算和逻辑运算表达式的结果只能是1或0。而按位运算的结果可以取0或1以外的值。

要注意区别按位运算符和逻辑运算符的不同, 例如, 若x=7, 则x&&8 的值为真(两个非零值相与仍为非零), 而x&8的值为0。

移位运算符">>"和"<<"是指将变量中的每一位向右或向左移动, 其通常形式为:

右移: 变量名>>移位的位数

左移: 变量名<<移位的位数

经过移位后, 一端的位被"挤掉", 而另一端空出的位以0 填补, 所以Turbo C中的移位不是循环移动的。

5.4 Turbo C的特殊运算符

一、"?"运算符

"?"运算符是一个三目运算符, 其一般形式是:

<表达式1>?<表达式2>:<表达式3>;

"?"运算符的含义是: 先求表达式1的值, 如果为真, 则求表达式2 的值并把它作为整个表达式的值; 如果表达式1 的值为假, 则求表达式3 的值并把它作为整个表达式的值。

例如:

main()

{

int x, y;

x=50;

y=x>70?100:0;

}

本例中, y将被赋值0。如果x=80, y将被赋值100。

因此, "?"运算符可以代替某些if-then-else形式的语句。

二、"&"和"*"运算符

"&"运算符是一个返回操作数地址的单目操作符。

"*"运算符是对"&"运算符的一个补充, 它返回位于这个地址内的变量值, 也是单目操作符。

例如:

main()

{

int i, j, *m;

i=10;

m=&i; /*将变量i的地址赋给m*/

j=*m; /*地址m所指的单元的值赋给j*/

}

上面程序运行后, i=10, m为其对应的内存地址, j的值也为10。

三、","运算符

","运算符用于将多个表达式串在一起, ","运算符的左边总不返回, 右边表达式的值才是整个表达式的值。

例如:

main()

{

int x, y;

x=50;

y=(x=x-5, x/5);

}

上面程序执行后y值为9, 因为x的初始值为50, 减5后变为45, 45除5为9赋给

y。

四、sizeof运算符

sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。

例如:

sizeof(double) 为8

sizeof(int) 为2

也可以求已定义的变量, 例如:

float f;

int i;

i=sizeof(f);

则i的值将为4。

五、联合操作

Turbo C中有一特殊的简写方式, 它用来简化一种赋值语句, 适用于所有的双目运算符。其一般形式为:

<变量>=<变量><操作数><表达式>

相当于

<变量><操作数>=<表达式>

例如:

a=a+b 可写成a+=b

a=a&b 可写成a&=b

a=a/(b-c) 可写成a/=b-c

5.5 Turbo C运算符的优先级

Turbo C规定了运算符的优先次序即优先级。当一个表达式中有多个运算符参加运算时, 将按下表所规定的优先级进行运算。表中优先级从上往下逐渐降低,同一行优先级相同。

例如:

表达式10>4&&!(100<99)||3<=5 的值为1

表达式10>4&&!(100<99)&&3<=5 的值为0

Turbo C运算符的优先次序

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

表达式┃优先级

────────────────────────────

()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员) 最高

────────────────────────────

!(逻辑非) ~(位取反) -(负号) ++(加1) --(减1) &(变量地址)

────────────────────────────

*(指针所指内容) type(函数说明) sizeof(长度计算)

────────────────────────────

*(乘) /(除) %(取模)

────────────────────────────

+(加) -(减)

────────────────────────────

<<(位左移) >>(位右移)

────────────────────────────

<(小于) <=(小于等于) >(大于) >=(大于等于)

────────────────────────────

==(等于) !=(不等于)

────────────────────────────

&(位与)

────────────────────────────

^(位异或)

────────────────────────────

|(位或)

────────────────────────────

&&(逻辑与)

────────────────────────────

||(逻辑或)

────────────────────────────

?:(?表达式)

────────────────────────────

= += -=(联合操作)

────────────────────────────

,(逗号运算符) ┃最低

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

c语言运算符优先级(二)

(1)先(括号)内层,后(括号)外层。

解释:有扩号时,最内层的括号中的东西先算,再一层层向外。

(2)先函数,后运算。

解释:式中有函数,例如sqrt(),fabs(),sin()之类,先算函数。

(3)先算术,后关系,再逻辑。

解释:逻辑表达式中,混有算术运算,要先算算术(加减乘除,函数)运算,再算关系(大小,等不等)运算。最后算逻辑(或与非),得到真假。

(4)先乘除,后加减。

解释:同算术一样,先做乘除,后做加减。

逻辑运算符“与”又叫逻辑乘,逻辑运算符“或”,又叫逻辑加,按先乘除,后加减,“与”比“或”优先。

(5)先左,后右

解释:同级运算,先做左边的,后做右边的。

(6)搞不清,加括号。

解释:自己写算术表达式和逻辑表达式时,搞不清运算符优先级,可以加括号,括号里的总是先。

c语言运算符优先级(三)

优先诀

括号成员第一; //括号运算符[] () ,成员运算符. ->

全体单目第二; //所有的单目运算符比如++ -- +(正) -(负) ,指针运算* &

乘除余三,加减四; //这个"余"是指取余运算即%

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

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

位与异或和位或; //这几个都是位运算: 位与(&) 异或(^) 位或(|)

"三分天下"八九十;

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

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

条件高于赋值, //三目运算符优先级排到13 位,只比赋值运算符和","高,需要注意的是赋值运算符很多!

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

C语言符号优先级

附录2 C语言中的运算符及其优先级 优先级运算符名称或含义使用形式结合方向说明 1 [] 数组下标数组名[常量表达式] 左到右() 圆括号 (表达式)/函数名 (形参表) . 成员选择(对象)对象.成员名 -> 成员选择(指针)对象指针->成员名 2 - 负号运算符-表达式 右到左 单目运算符(类型) 强制类型转换(数据类型)表达式 ++ 自增运算符++变量名/变量名++ 单目运算符-- 自减运算符--变量名/变量名-- 单目运算符* 取值运算符*指针变量单目运算符& 取地址运算符&变量名单目运算符! 逻辑非运算符!表达式单目运算符~ 按位取反运算符~表达式单目运算符sizeof 长度运算符sizeof(表达式) 3 / 除表达式/表达式 左到右 双目运算符* 乘表达式*表达式双目运算符% 余数(取模) 整型表达式/整型表 达式 双目运算符 4 + 加表达式+表达式 左到右 双目运算符- 减表达式-表达式双目运算符 5 << 左移变量<<表达式 左到右 双目运算符>> 右移变量>>表达式双目运算符 6 > 大于表达式>表达式 左到右 双目运算符>= 大于等于表达式>=表达式双目运算符< 小于表达式<表达式双目运算符<= 小于等于表达式<=表达式双目运算符 7 == 等于表达式==表达式 左到右 双目运算符!= 不等于表达式!= 表达式双目运算符 8 & 按位与表达式&表达式左到右双目运算符 9 ^ 按位异或表达式^表达式左到右双目运算符 10 | 按位或表达式|表达式左到右双目运算符 11 && 逻辑与表达式&&表达式左到右双目运算符 12 || 逻辑或表达式||表达式左到右双目运算符 13 ?: 条件运算符表达式1? 表达式2: 表达式3 右到左三目运算符 14 = 赋值运算符变量=表达式 右到左/= 除后赋值变量/=表达式 *= 乘后赋值变量*=表达式 %= 取模后赋值变量%=表达式 306

C语言运算符优级列表

C语言运算符优先级列表 运算符的优先级:C语言中,运算符的运算优先级共分为15 级。1 级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。 运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z 则y 应先与“-”号结合,执行x-y 运算,然后再执行+z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 优先级运算符名称或含义使用形式结合方向说明 1 [] 数组下标数组名[常量表达式] 左到右() 圆括号 (表达式)/函数名(形 参表) . 成员选择(对象)对象.成员名 -> 成员选择(指针)对象指针->成员名 2 - 负号运算符-表达式 右到左 单目运算符(类型) 强制类型转换(数据类型)表达式 ++ 自增运算符++变量名/变量名++ 单目运算符-- 自减运算符--变量名/变量名-- 单目运算符* 取值运算符*指针变量单目运算符& 取地址运算符&变量名单目运算符! 逻辑非运算符!表达式单目运算符~ 按位取反运算符~表达式单目运算符sizeof 长度运算符sizeof(表达式) 3 / 除表达式/表达式 左到右 双目运算符* 乘表达式*表达式双目运算符% 余数(取模) 整型表达式/整型表 达式 双目运算符 4 + 加表达式+表达式 左到右 双目运算符- 减表达式-表达式双目运算符 5 << 左移变量<<表达式 左到右 双目运算符>> 右移变量>>表达式双目运算符 6 > 大于表达式>表达式左到右双目运算符 1 / 1

C语言运算符优先级详解

优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。 所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。 具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。 其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。 接下来是算术运算符,*、/、%的优先级当然比+、-高了。 移位运算符紧随其后。 其次的关系运算符中,< <= > >=要比 == !=高一个级别,不大好理解。 所有的逻辑操作符都具有不同的优先级(单目运算符出外,!和~) 逻辑位操作符的"与"比"或"高,而"异或"则在它们之间。 跟在其后的&&比||高。 接下来的是条件运算符,赋值运算符及逗号运算符。 在C语言中,只有4个运算符规定了运算方向,它们是&&、| |、条件运算符及赋值运算符。 &&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。如 a = 0 && b; &&运算符的左边位0,则右边表达式b就不再判断。 在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。 赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。 初——单——算,关——逻,条——赋——逗 断句如上。怎么记忆呢? 我是这样记忆的:“”内表示运算符的简称。 “初”次“单”独找你“算”账,(因为你和关羽有仇) “关”羽带着兵巡“逻”(因为你躲了起来) 你跑到别处了,隐姓埋名,“挑”着“豆腐”卖。(当了卖豆腐的):豆腐——实际上是“赋”“逗” ?2009-4-8 15:43 ?回复 我是这样记得: 一个自称黑的初学者连编程都不会还算什么黑客,把自己关起来反思吧,逻辑都没有条理,因为你不认真学!还找理由说因为天赋不够,真逗``

《C语言优先级》Word文档

学习C语言也有一段时间了,感觉C语言的运算符优先级很难记住,特别是对于初学者而言! 也许你会说没有记住没关系,用括号来改变优先级就可以了。但是很多情况下,因为依赖括号很容易导致程序可读性差,当然我不是反对加括号,只是提倡恰到好 处。总之,还是记住好些,读别人的程序也方便点。近来翻看了一下优先级,感觉还是有规律可循的,拿来和大家分享,希望对大家有帮助! 先给出C语言的运算符优先级表: C语言运算符优先级表(由上至下,优先级依次递减)

第一、像() [] -> .之类的理所当然是最优先的,其实它们压根也不算什么运算符了 第二、除了上面的四种运算符之外,接下来就是单目运算符,也就是! ~ ++ -- - (type) * & sizeof 了。记住它们的顺序可是自右向左啊!其实结合实例是很容易理解的,比如i++等。

第三、跟着就是双目运算符了,也是C语言运算符优先级中最容易让人混淆的地方了。其实也没有那么可怕,你认真观察就会发现。在双目运算符中,

算术运算符优先级最高,然后是移位运算符,接着是关系运算符,再着是逻辑运算符。不过这边需要说的是,在关系运算符中,< <= > >=比== !=的优先级来得高。此外,在逻辑运算符中,与运算又比或运算优先级来得高,异或则处于二者之间。同样的,你可以类比出&&与||的优先级关系. 第四、在双目操作符之后,就是三目操作符了,没有什么好说的了。 第五、然后是赋值操作符,你也许会把赋值操作符与三目运算符的优先级搞混。没有关系,我想你一定写过这样的语句(如果没有,请你记住!):max = (a>b)?a:b; ,从这个语句里,你就不难记住赋值运算符为什么比三目运算符的优先级低了! 第六、逗号运算符是分割各个子语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低了,我想这个应该不是很容易混淆的。 总结一下,按运算符优先级从高到低:单目运算符->双目运算符->三目运算符->赋值运算符->逗号运算符 特别在双目运算符中,按运算符优先级从高到低:算术运算符->移位运算符->关系运算符(其中== 和 !=优先级又较低)->逻辑运算符(按位与-〉按位异或-〉按位或-〉逻辑与-〉逻辑或)! Examples: ++p->len = ++(p->len) *p->str++ = *(p->str)++ = *((p->str)++) *p++->str = *(p++)->str = *((p++)->str) msb<<4+lsb = msb<<(4+lsb) *p.f = *(p.f) val&mask!=0 = val&(mask!=0) (注:素材和资料部分来自网络,供参考。请预览后才下载,期待你的好评与关注!)

C语言运算符优先级 详细列表

C语言运算符优先级详细列表 运算符的优先级:C语言中,运算符的运算优先级共分为15 级。1 级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。 运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z 则y 应先与“-”号结合,执行x-y 运算,然后再执行+z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 优先级运算符名称或含义使用形式结合方向说明 1 [] 数组下标数组名[常量表达式] 左到右() 圆括号 (表达式)/函数名(形 参表) . 成员选择(对象)对象.成员名 -> 成员选择(指针)对象指针->成员名 2 - 负号运算符-表达式 右到左 单目运算符(类型) 强制类型转换(数据类型)表达式 ++ 自增运算符++变量名/变量名++ 单目运算符-- 自减运算符--变量名/变量名-- 单目运算符* 取值运算符*指针变量单目运算符& 取地址运算符&变量名单目运算符! 逻辑非运算符!表达式单目运算符~ 按位取反运算符~表达式单目运算符sizeof 长度运算符sizeof(表达式) 3 / 除表达式/表达式 左到右 双目运算符* 乘表达式*表达式双目运算符% 余数(取模) 整型表达式/整型表 达式 双目运算符 4 + 加表达式+表达式左到右双目运算符

C语言运算符优先级表

C语言运算符优先级表(由上至下,优先级依次递减) 第一、像() [] -> .之类的理所当然是最优先的,其实它们压根也不算什么运算符了第二、除了上面的四种运算符之外,接下来就是单目运算符,也就是! ~ ++ -- - (type) * & sizeof 了。记住它们的顺序可是自右向左啊!其实结合实例是很容易理解的,比如i++等。第三、跟着就是双目运算符了,也是C语言运算符优先级中最容易让人混淆的地方了。其实也没有那么可怕,你认真观察就会发现。在双目运算符中,算术运算符优先级最高,然后是移位运算符,接着是关系运算符,再着是逻辑运算符。不过这边需要说的是,在关系运算符中,< <= > >=比== !=的优先级来得高。此外,在逻辑运算符中,与运算又比或运算优先级来得高,异或则处于二者之间。同样的,你可以类比出&&与||的优先级关系. 第四、在双目操作符之后,就是三目操作符了,没有什么好说的了。第五、然后是赋值操作符,你也许会把赋值操作符与三目运算符的优先级搞混。没有关系,我想你一定写过这样的语句(如果没有,

请你记住!):max = (a>b)?a:b; ,从这个语句里,你就不难记住赋值运算符为什么比三目运算符的优先级低了!第六、逗号运算符是分割各个子语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低了,我想这个应该不是很容易混淆的。总结一下,按运算符优先级从高到低:单目运算符->双目运算符->三目运算符->赋值运算符->逗号运算符特别在双目运算符中,按运算符优先级从高到低:算术运算符->移位运算符->关系运算符(其中== 和 !=优先级又较低)->逻辑运算符(按位与-〉按位异或-〉按位或-〉逻辑与-〉逻辑或)! 运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即: 当一个运 算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, C 语言规定了各种运算符的结合方向( 结合性) 。大多数运算符结合方向是“自左至右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减 号结合, 执行a- b 的运算, 再执行加c 的运算。除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符。关于结合性的概念在其他高级语言中是没有的, 这是C语言的特点之一。 ++a 或a++和--a 或a--分别称为前置加或后置加运算和前置减或后置减运算,都是单目运算符。值得注意的是, 前置、后置运算只能用于变量, 不能用于常量和表达式, 且结合方向是从右至左。如当i=6 时, 求- i++的值和i 的值。由于“- ”(负号) “++”为同一个优先级, 故应理解为- (i++), 又因是后置加, 所以先有-i++的值为-6, 然后i 增值1 为7, 即i=7。 例1 main() { int a=3,b=5,c; c=a*b+++b; printf ( “c=%d”, c); } 要得出c 的值, 首先要搞清+++的含义。++运算符的结合方向是自右向左的, 如果将表达式理解为:c=a*b+(++b);实际上C 编译器将表达式处理为:c=(a*b++)+b, 因为C 编译器总是从左至右尽可能多地将若干个字符组成一个运算符, 如i+++j 等价于(i++)+j。接下来是解决a*b++的问题, 因为++运算符的运算对象只能是整型变量而不能是表达式或常数, 所以a *b++显然是a*(b++)而非(a*b)++, 因此整个表达式就是c=(a*(b++))+b,结果为c=20。 例2 main() { int i=1,j; j=i+++i+++i++; printf( “i=%d,j=%d\n”, i,j);

c语言运算符优先级

c语言运算符优先级 Turbo C的运算符非常丰富, 主要分为三大类: 算术运算符, 关系运算符与 逻辑运算符, 按位运算符。除此之外, 还有一些用于完成特殊任务的运算符。下 面分别进行介绍。 5.1 算术运算符 Turbo C的算术运算符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 操作符作用 ──────────────────────────── + 加, 一目取正 - 减, 一目取负 * 乘 / 除 % 取模 -- 减1 ++ 加1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 一、一目和二目操作 一目操作是指对一个操作数进行操作。例如: -a是对a进行一目负操作。 二目操作(或多目操作)是指两个操作数(或多个操作数)进行操作。 在Turbo C中加、减、乘、除、取模的运算与其它高级语言相同。需要注意 的是除法和取模运算。 例如: 15/2 是15除以2商的整数部分7 15%2 是15除以2的余数部分1 对于取模运算符"%", 不能用于浮点数。 另外, 由于Turbo C中字符型数会自动地转换成整型数, 因此字符型数也可 以参加二目运算。 例如: main() { char m, n; /*定义字符型变量*/ m='c'; /*给m赋小写字母'c'*/ n=m+'A'-'a'; /*将c中的小写字母变成大写字母'B'后赋给n*/ ... } 上例中m='c'即m=98, 由于字母A和a的ASCII码值分别为65和97。这样可以将

小写字母变成大写字母, 反之, 如果要将大写字母变成小写字母, 则用c+ 'a' -'A'进行计算。 二、增量运算 在Turbo C中有两个很有用的运算符, 在其它高级语言中通常没有。这两个 运算符就是增1和减1运算符"++"和"--", 运算符"++"是操作数加1, 而"--" 则是 操作数减1。 例如: x=x+1 可写成x++, 或++x x=x-1 可写成x--, 或--x x++(x--)与++x(--x)在上例中没有什么区别, 但x=m++和x=++m却有很大差别。 x=m++ 表示将m的值赋给x后, m加1。 x=++m 表示m先加1后, 再将新值赋给x。 三、赋值语句中的数据类型转换 类型转换是指不同类型的变量混用时的类型改变。 在赋值语句中, 类型转换规则是: 等号右边的值转换为等号左边变量所属的类型。 例如: main() { int i, j; /*定义整型变量*/ float f, g=2.58; /*定义浮点型变量*/ f=i*j; /*i与j的乘积是整型数, 被转换成为浮点数赋给f*/ i=g; /*g中的浮点型数转换成为整型数赋给i*/ ... } 由于Turbo C按上述数据类型转换规则, 因此在作除法运算时应特别注意。 例如: main() { float f; int i=15; f=i/2; } 上面程序经运行后, f=7并不等于准确值7.5。正确的程序应该是: main() { float f; int i=15;

C语言运算符及其优先级等级

C语言运算符 C语言运算符 1级优先级左结合 () 圆括号 [] 下标运算符 -> 指向结构体成员运算符 . 结构体成员运算符 2级优先级右结合 ! 逻辑非运算符 ~ 按位取反运算符 ++ 前缀增量运算符 -- 前缀增量运算符 + 正号运算符 - 负号运算符 (类型) 类型转换运算符 * 指针运算符 & 地址与运算符 sizeof 长度运算符 3级优先级左结合 * 乘法运算符 / 除法运算符 % 取余运算符 4级优先级左结合 + 加法运算符 - 减法运算符 5级优先级左结合 << 左移运算符 >> 右移运算符 6级优先级左结合 <、<=、>、>= 关系运算符 7级优先级左结合 == 等于运算符 != 不等于运算符 8级优先级左结合

& 按位与运算符 9级优先级左结合 ^ 按位异或运算符 10级优先级左结合 | 按位或运算符 11级优先级左结合 && 逻辑与运算符 12级优先级左结合 || 逻辑或运算符 13级优先级右结合 ? : 条件运算符 14级优先级右结合 = += -= *= /= %= &= ^= |= <<= >>= 全为赋值运算符 15级优先级左结合 ,逗号运算符 运算符优先级 优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。 所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。 具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。 其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。 另外在C语言里没有前置后置之分因为++ -- 是右结合所以右侧优先运算表现为 "后置优先级比较高" 的假象前置和后置的区分是因为运算符重载而后加入C++的 接下来是算术运算符,*、/、%的优先级当然比+、-高了。 移位运算符紧随其后。 其次的关系运算符中,< <= > >=要比 == !=高一个级别,不大好理解。 所有的逻辑操作符都具有不同的优先级(单目运算符出外,!和~) 逻辑位操作符的"与"比"或"高,而"异或"则在它们之间。 跟在其后的&&比||高。

C语言运算符优先级和结合性一览表

C语言运算符优先级和结合性一览表 所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁。事实上在编程的时候也不需要考虑优先级的问题。因为如果不知道优先级高低的话,加一个括号就可以了,因为括号( )的优先级是最高的。比如程序中: k = (j>i) && (8==i); 根据运算符的优先级,这条语句完全可以写成: k = j>i && 8==i; 但是第一种写法别人一看就知道先计算谁后计算谁。而且加圆括号也是一种编程规范,因为程序不只是写给自己看。 此外运算符还有“目”和“结合性”的概念,这个很简单。“目”就是“眼睛”的意思,一个运算符需要几个数就叫“几目”。C语言中大多数的运算符都是双目的,也有单目和三目的。单目运算符比如逻辑非,如!1,它就只有一只眼睛,所以是单目的。整个C语言中只有一个三目运算符,即条件运算符? :。 优先级都是关于优先级不同的运算符参与运算时先计算谁后计算谁。但是如果运算符的优先级相同,那么先计算谁后计算谁呢?这个就是由“结合性”决定的。比如1+2×3÷4,乘和除的优先级相同,但是计算的时候是从左往右,即先计算乘再计算除,所以乘和除的结合性就是从左往右。 C语言中大多数运算符的结合性都是从左往右,只有三个运算符是从右往左的。一个是单目运算符,另一个是三目运算符,还有一个就是双目运算符中的赋值运算符=。双目运算符中只有赋值运算符的结合性是从右往左的,其他的都是从左往右。运算符的“结合性”也不要死记,在不断使用中就记住了。 运算符优先级和结合性一览表

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

C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

C语言运算符大全

C语言运算符大全 C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 2.6.1算术运算符 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C 语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 2.6.2自增和自减 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1 操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x; 此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级:

相关文档