❶ c语言 运算符 的结合性 怎么理解求举例子详细解答!!
关于C语言运算符的结合性内容还是比较多的,可以分享给你几个链接,里面对这个问题讲的还是比较清楚的,也有相应的实例,如下:
http://blog.chinaunix.net/uid-1924596-id-3049989.html
http://wenku..com/link?url=_9GNaTgaQPf_
希望能帮到你。
❷ C语言中的左结合性是什么
意思是:从表达式右边开始执行;只有同优先级的运算符才具有结合性“自左至右”或者“自右自左”一说。
有些运算符的优先级是错误的。
“当按照常规方式使用时,可能引起误会的任何运算符”就是存在错误优先级的运算符。
.的优先级高于*。->操作符用于消除这个问题。
*p.f变成了*(p.f)而不是(*p).f
[]高于*,于是int
*ap[]中的ap变成了元素为int指针的数组。
函数()高于*,因此,int
*fp()不再是函数指针了,而是一个函数,返回int
*。
逗号运算符在所有运算符中优先级最低,所以,i
=
1,
2就成了(i
=
1),
2而不是i
=
(1,
2)。
逗号运算符的值是最右边操作数的值,逗号运算符结合性从左至右,因此又称为顺序求值运算符。
在表达式中如果有布尔操作、算术运算、位操作等混合计算,始终应该在适当的地方加上括号。
x
=
f()
+
g()
*
h();
乘法先于加法执行,但是g()和h()的调用可能以任何顺序出现。
同样,f()可能在乘法之前调用,也可能在乘法之后调用。
优先级和结合性规则告诉你哪些符号组成一个意群,大部分这样的意群内部如何进行计算的次序是未定义的。
有些操作符,如&&和||等,其操作数的计算顺序是确定的,它们使用短路原则。
C语言中记住两个优先级就够了:乘法和除法先于加法和减法,在涉及其他操作符时一律加上括号。
结合性用于在几个操作符具有相同的优先级时确定先执行哪一个。
每个操作符拥有某一级别的优先级,同时也拥有左结合性或者右结合性。所有的赋值符(包括复合赋值符)都具有右结合性(从右到左执行),因此可以使用连等的赋值形式。
唯一的三目运算符?:也是具有右结合性的。
所有优先级相同的操作符,它们的结合性也相同,这是必须如此的。在函数调用中,各个参数的计算顺序是不确定的。
❸ c语言运算符结合性
c语言中右结合的运算符有:
(1)!逻辑非运算符;~按位取反运算符;++前缀增量运算符;--前缀减量运算符;+正号运算符;-负号运算符;(类型)类型转换运算符;*指针运算符;&地址运算符;sizeof长度运算符
(2)?
:条件运算符
(3)=、
+=、
-=、
*=、
/=、
%=、
&=、
^=、
|=、
<<=、
>>=赋值运算符
❹ c语言中右结合性的有哪些阿怎么区别记忆呢
常用的有++(前置) --(前置),三目运算符(?:) 赋值运算符(=).一般记住常用就可以,其它用到时查相关书籍即可。
❺ C语言中的结合性是怎么回事
简单说就是,从表达式右边开始执行;
只有同优先级的运算符才具有结合性“自左至右”或者“自右自左”一说。
exp(不同优先级运算符,依据优先级高低进行运算):
int a = 1, b =10, c = 30;
int a = a * b + c;
因为 * 比 + 的运算符优先级高,所以
先计算a * b (先计算左边,未考虑结合性),在计算 10 + c
结果是 a = 300
exp(同优先级运算符依据结合性进行运算):
int a, b = 1, c = 8;
a = b = c;
赋值运算符其结合性即为自右向左,即 a = ( b = c), 其结果是 b = 8, a = 8;
(错误答案:自左向右进行结合的话a = 1)
❻ 关于C语言结合性
@@@@@@@@@@@@@@@@@@
【规则】关于自增自减运算,很多书籍没有把问题讲清楚,在C语言里是这样的:
1.后置运算:k++表示先运算,后自加。
意思是遇到k++了,我先把当前的k的值拿来参加运算,后面再去管它的自加。
那么,【“后面”后到什么程度呢?要后到当前的语句执行完,即遇到分号;表示
语句执行完了,所以k才自加1。】
2.前置运算:++k表示先自加,后运算
这个意思就是遇到++k了,先把k的值加了1,再往后执行别的。
掌握好这两点,k--和--k也是一样的道理。
3.++、--是的运算方向都是,从右往左。
@@@@@@@@@@@@@@@@@@
这里:
1.*p++和*(p++)都是一样的。
分析:
因为取地址运算符“*”和增量运算符“++”,而且是同级运算。按理说同级运算
从左向右结合!(你们老师讲的就是这个规则,得出的结论是*p++是a++,
*(q++)才是地址++ )。
但是,请记住,这里*p++不适用这个规则!++和 *运算方向都是从右向左,因此结合从
右向左,有些书上讲++、--时专门讲了这个问题!
2.printf("%d %d",*p,(*q)++);老师说从右向左算
这一点是这样的,printf()这个输出函数的参数的求值顺序是从右向左的,*p和(*q)++
分别是这个函数的两个参数!明白吗?记住了。并不是你理解的(就是先算(*q)++再
算*p~~为什么啊?)即,printf("%d %d",*p,(*q)++);这个语句
是先求 (*q)++的值,再求*p的值的。
3.*(q++)先算*q然后地址再++~~~ ,(事实上就是这么运算的!)
请看:【规则】中,后置到什么地方?
*(q++)这个表达式的值是这么得的,先算q++,再算*;但是++后置了,所以事实上是
先算*q然后地址再++。
❼ 什么是C语言的结合性
在几个操作符具有相同的优先级时决定先执行哪一个。比如:
int a, b = 2;
a = b = 3;
那么a,b的值?答案是a,b都是3.
因为赋值运算符具有右结合性,但执行到“a = b = 3”表达式时,先执行“b=3”,然后赋值运算符运算完后返回左操作数,即b(等于3)。于是原表达式成为“a=b",于是a也为3.
❽ C语言中++、--结合性是怎样的
仔细看了一下你的题目,并且在编译器中运行了一下:
运行的结果如下:
接下来我们解析下为什么是这个结果:
1、++ : 优先级为2,结合规则:自右至左。
2、|| 和 && :优先级分别在12和11,结合规则为:自左至右。
3、++,--是算术运算符,而 ||, && 是逻辑运算符。
4、实际上++x || ++y && ++z;是一个逻辑表达式,整个运算过程遵从的是 || 和 && 的结合规则;而在逻辑的每一个条件中(++x, ++y, ++z),是一个运算表达式。
以上解释如果对你有帮助,请采纳下,谢谢。
❾ C语言中左右结合性,怎么理解
简单说就是,从表达式右边开始执行;
只有同优先级的运算符才具有结合性“自左至右”或者“自右自左”一说。
exp(不同优先级运算符,依据优先级高低进行运算):
int a = 1, b =10, c = 30;
int a = a * b + c;
因为 * 比 + 的运算符优先级高,所以
先计算a * b (先计算左边,未考虑结合性),在计算 10 + c
结果是 a = 300
exp(同优先级运算符依据结合性进行运算):
int a, b = 1, c = 8;
a = b = c;
赋值运算符其结合性即为自右向左,即 a = ( b = c), 其结果是 b = 8, a = 8;
(错误答案:自左向右进行结合的话a = 1)
❿ C语言算数运算符的结合性
结合性是规定运算符与运算数组合成表达式的结合方向。因为运算符是有优先级别的,表达式的运算应该是先按运算符的优先级由高到低的顺序,结合运算数进行计算,当遇到同级别运算符或者是符号一样但运算目数不同时,就要用到运算符的结合性。
例如:x=-b+c
或
x=a-b+c与x=a-b*c两个表达式计算时是这样的
对于x=-b+c,表达式运算时是这样的,先数据栈读入x,符号栈读入=(赋值运算符),因为=是双目运算符,还要读入数据,所以继续向后读表达式;又读到-号,不是数据,而且-号的运算级别高于=号,所以-号进入符号栈,继续向后读表达式,读到数据b进入数据栈,这时候-b就符合负号运算符的自右向左结合的单目运算,就进行求值运算,符号栈中-号出栈,与数据栈中b结合成-b,-b就变为一个新的运算数据进入数据栈;后面继续读入+号,它是双目运算符后面还要读入一个运算数据,c就读入了数据栈,后面没有运算符再读入,表达式结束,那么就进行符号栈+号和数据栈中c和-b的值相加,将结果存入数据栈中,符号栈中+出栈;符号栈中还有=号,它和数据栈中的结果与x形成赋值的自右向左双目结合运算,表达式的结果就此运算完毕。
对于x=a-b+c与x=a-b*c两个表达式计算时,前面x=a-b过程是相同的,只是后面,由于*号比+号的运算级别高,所以表达式x=a-b*c中要先算b*c的结果,在一步一步回退进行a-和x=的运算。而表达式x=a-b+c中+号与-同级别,所以当满足运算条件时就先进行a-b运算,然后进行+c和x=的运算。
不知道以上的说明,是否能让你明白c语言中运算符结合性和表达式求值的过程。