当前位置:首页 » 编程语言 » c语言同优先级结合方式
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言同优先级结合方式

发布时间: 2023-01-18 03:56:55

‘壹’ c语言优先级是什么

c语言优先级是:每种同类型的运算符都有内部的运算符优先级,不同类型的运算符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。

当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。

各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。

优先级结合性:

当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。

C语言也将34种运算符规定了不同的结合性。大多数运算符结合方向是“自左至右”,即:先左后右,也叫“左结合性”

例如 a-b + c,表达式中有-和+两种运算符,且优先级相同,按先左后右结合方向,先围绕减号结合,执行a-b的运算,再围绕加号结合,完成运算(a-b) + c。除了左结合性外,C 语言有三类运算符的结合方向是从右至左,也叫“右结合性”。

‘贰’ C语言的结合方向

同优先级的结合方向:右到左
*p ++,优先级一样,所以p++先结合计算,然后是*()
后缀++,先引用p值,再加1
没错啊

‘叁’ c语言优先级相同怎么办

结合方向。在c语言使用方法中了解到其优先级相同时是需要按照结合方向进行的,需要用户进行连接,其是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。

‘肆’ C语言中 优先级相同的运算符,根据结合性决定计算顺序—书本上原文是不是有误

扯吧~~~~~~

结合,自右至左没错
可是这说的是符号之间(同级);

但是符号的结合数有数量上的差别:
比如 符号* 这是指针上的吧??哈 *号只结合一个数
当有两个* 比如**P 系统先识别哪一个? -->当然是自右至左了
注意:自右至左 说的是符号之间!!!
又如 + 号 - 号 是同级吧?
6+4-2 这个算式为例, 同级符号自右至左
也就是说先+ 后- 吧??
可是呢,-号和+号它们的结合数数量是两个啊
自右至左说的是符号之间
计算机怎么算上面的式子呢?
它是这么算的: 先算4-2; 然后再算6+*;
这就是自右至左!!!

记住,理解“自右至左”的含义!!
你看 你开始的理解应该是没看符号吧,觉得既然同级嘛,那就是2-4+6喽?呵呵 迷糊了吧??

理解万岁!!!

‘伍’ C语言中优先级和结合性 例如:*p++

*p++,由于++和*的优先级相同,结合方向为自右至左。所以确实*p++等价于*(p++),而p++其实取值的时候还是取p的,是用过之后才能+1。所以*(p++)就是先执行p++得到p,然后执行*p,得到p指向的值,等这个运算结束了才能+1。你的那个理解应该是对于*(++p)的!

‘陆’ c语言运算符的优先级顺序

c语言运算符优先级从高到低的顺序依次如下:

优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。

不同类型的运算符之间也有相应的优先级顺序:

一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。

各种运算符间的优先级如下:

数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。

‘柒’ c语言*pa++,同优先级,结合方式不是自右而左吗怎么先算*pa,在++的

事实上是这样的,由于是同优先级,而且结合方式自右向左,因此先算a++,再算*pa,这是第一点;

第二,在算a++的时候,可以分为两步,第一步,对a赋值,第二步将a=a+1;
第三,在算完a的赋值后,这时就对pa的原值进行*运算,即得到a的值,也就是在进行完第二中的第一步后就将进行*pa,然后再进行第二中的第二步即将pa中的值(即a)加1 ,这时pa将不再指向a 那么结果就是*pa=a0; a=a0+1;

‘捌’ C语言中同等级运算的先后顺序

同等级的运算符,先后顺序按结合性来进行。下面的代码有利于理解结合性。
int a,b=1,c=2;
a=b=c;上面的代码是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。
所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。
例:
a=b+c+d=是右结合的,所以先计算(b+c+d),然后再赋值给a
+是左结合的,所以先计算(b+c),然后再计算(b+c)+d
在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:
1:&&

||
规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。
2:条件表达式的求值顺序是这样规定的:
test
?
exp1

exp2;
条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。
3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号','还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!

‘玖’ 【C语言】优先级,结合方向和执行顺序

K&R的书中一再强调"C is not a big language",当时看书的时候无法理解这句话的意思。现在我的理解是C标准本身的限制比较小,留给程序员的空间较大。这样一来C中的而有些问题标准就没有给出限定,就会产生一些让人迷惑的地方。今天我遇到了一个这样的问题,解决这些问题有的时候看起来是“钻牛角尖”,好吧,我就是一个爱钻牛角尖的人。这里需要解决的问题是执行顺序的问题,先给出几个问题。

执行完这两个语句后i和j的值各是什么?(看着是不是很熟悉,上次笔试考C中是不是有这个呢)

执行完上述语句后,i和数组arry中的值是多少?

输出结果是什么?(来自于C Puzzle Book Operators 1.6 )
先把这几个问题放在这里,先思考下,下面将会解决他们。

C语言经典着作 “The C Programming Language” 中对于side effects的定义:

这里述说的side effect可以理解为一种“副作用”,这种作用是改变一个变量的值。
“C In Nutshell” 中关于side effects的定义:

相对于K&R中的定义这里使用了对于环境的改变,这应该更加准确。总结:side effects 就是程序中的实体产生的改变,这里所说的实体通常指变量。
赋值,自增,自减表达式会产生side effects,函数调用表达式也有可能产生side effects。

序列点(sequence points)是一种逻辑意义的点,它的意义在于,逻辑点前的副作用(side effects)都在这时生效。C标准中定义的序列点总共有三类,第一类是完全表达式(full expression);第二类是||,&&,?:和;第三类是函数调用,在所有的参数确定后、函数真正调用之前。

标准中规定了在前一个序列点前的副作用都会在前一个序列点后完成,但是标准没有规定两个序列点之间的副作用生效的顺序,不同的C语言实现的顺序可能不同。请注意这一点,这是所有问题产生的根本原因。如果两个序列点之间有超过两个的副作用作用在同一个实体上,这样不同的编译器产生的结果就不同,这种情况在标准中称为unspecified 。所以在实际应用中应该避免这种情况的出现,我把这一个原则称为为SS1。

是不是遵守了SS1原则就不会产生unspecified了呢?非也。可以设想这样一种情况:每一个实体(A)在两个序列点之间被两次使用,只有一次对这个实体本身产生副作用,另外一次被间接的用来产生副作用作用于另外一个实体(B)。在前面设想的这种情况下虽然符合SS1原则,但是我们会发现被间接用来产生副作用时,对于实体(B)产生的副作用肯定会跟实体(A)有关,但是这个实体(A)在这个序列点区间中有被副作用作用,那么我们就无法确定这个实体(A)的值了,从而实体(B)也就无法确定了。这里可以归纳为:在两个序列点之间,如果出现对一个实体的多次引用,并且只有一次会对该实体产生副作用(SS1),那么所有的这些引用都必须用来产生这个副作用 ,我把这一个原则称为SS2。只有同时遵守了SS1和SS2,写出的表达式才不是unspecified类型的。

可以清晰的看到标准中使用了两句话来概括这种问题,这正好对应于SS1,SS2原则。

下面给出更为具体的方法:
1)在一个表达式中最多只改变一个实体。
2)如果一个实体在一个表达式被改变,并且出现次数大于一次,请保证所有实体的出现都是为了产生这个“改变”。
例如: i = i+1;
3)如果不能遵守1),那么请保证改变的是不同的实体。
例如:c = *p++;
4)如果1)和2)都不能遵守,那么请使用序列点将表达式分开。
例如 : (c = getchar()) != EOF && c != ‘\n’;

C语言中组成程序的基本单位是表达式(expression),表达式是指用操作符(operator)和操作数(operand)连接起来的式子。C标准给出了最基本的操作符,通过这些操作符可以组成简单表达式,同样也可以通过复合产生复杂表达式。当一个表达式中出现多个操作符,多个操作数的时候,操作符合操作数是如何组合起来的呢?优先级和结合方向就是用来解决这个问题的,可以这么说,优先级和结合方向给出了一个表达式的含义,这只是说明了各个操作符和操作数是怎么聚合起来的。

仅仅依靠优先级和结合方向是无法确定一个复合表达式中对各个子表达式的求值顺序。标准中对于这点的规定是:
两个相邻的操作符的执行顺序由它们的优先级决定。如果它们优先级相同,它们的执行顺序由它们的结合性决定。除此之外,编译器可以自由决定任何顺序对表达式进行求值,只要它不违反逗号,&&,||和?:操作符所施加的限制。

1)j = i++ + i++ + i++;
这个表达式违反了SS1,不同的编译器产生的结果可能不同。
2)arry[i] = i++;
这个表达式违反了SS2,不同的编译器产生的结果可能不同。
3)x = y = z = 1;
++x || ++y && ++z; PRINT(x, y, z);
&&的优先级比|| 的优先级高,所以:
++x || ++y && ++z 等效于++x || (++y && ++z)
这里就很容易犯错,会认为先执行++y && ++z 在执行++x || ( … ),这种观点是错误的,c中只对 逗号,、逻辑与 &&、
逻辑或 || 和 条件表达式规定了执行顺序,对于逻辑表达式方向是从左向右执行的。本例子中,先执行 ++x = 2,逻辑
或表达式被短路,++y && ++z没有执行,最后x = 2, y = 1, z = 1;

通过本课题的学习加深了对于c的理解,理解SS1,SS2原则。在实际应用中应该遵守“一条语句只做一件事的原则”。

‘拾’ c语言中的运算符优先级和结合性

32个运算符:
1级优先级 左结合
() 圆括号
[] 下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符
2级优先级 右结合
! 逻辑非运算符
~ 按位取反运算符
++ 前缀增量运算符
-- 前缀增量运算符
+ 正号运算符
- 负号运算符
(类型) 类型转换运算符
* 指针运算符
& 地址与运算符
sizeof 长度运算符
3级优先级 左结合
* 乘法运算符
/ 除法运算符
% 取余运算符
4级优先级 左结合
+ 加法运算符
- 减法运算符
5级优先级 左结合
<< 左移运算符
>> 右移运算符
6级优先级 左结合
<、<=、>、>= 关系运算符
7级优先级 左结合
== 等于运算符
!= 不等于运算符
8级优先级 左结合
& 按位与运算符
9级优先级 左结合
^ 按位异或运算符
10级优先级 左结合
| 按位或运算符
11级优先级 左结合
&& 逻辑与运算符
12级优先级 左结合
|| 逻辑或运算符
13级优先级 右结合
? : 条件运算符
14级优先级 右结合
= += -= *= /= %= &= ^= |= <<= >>= 全为赋值运算符
15级优先级 左结合
, 逗号运算符
回答好几遍了=。=这些内容