‘壹’ c语言中运算符的结合方向什么时候从左至右,什么时候从右至左
左结合性:自左至右。
右结合性:自右至左。
一个运算量两侧的运算符优先级相同时,按运算符的结合性所规定的结合方向处理。C语言中各运算符的结合性分为两种,即左结合性和右结合性。
如,算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。
而最典型的右结合性运算符是赋值运算符,如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。
(1)c语言判断从右向左扩展阅读
C语言中的运算符
(1)算术运算符(+,-,*,/,%,++,--)。
(2) 关系运算符(<, >, <=, >=, ==, ![KG-*8]=) 。
(3) 逻辑运算符(!, &&, ||) 。
(4) 位运算符(<<, >>, ~, |, ^, &) 。
(5)赋值运算符(=,及其双目运算符的扩展赋值运算符)。
(6)条件运算符(?:)。
(7)逗号运算符(,)。
(8) 指针运算符(*, &) 。
(9)求字节数运算符(sizeof)。
(10)强制类型转换运算符((类型))。
(11) 分量运算符(·, ->) 。
(12)下标运算符([])。
(13)圆括号运算符(())。
‘贰’ C语言,条件运算符:,结合方向从右到左是什么意思,求详解
之前的回答有误,应以此为准,转自网页链接
条件运算符?:是右结合的。因此,表达式
a ? b : c ? d : e
a ? b ? c : d : e
分别等同于
a ? b : (c ? d : e)
a ? (b ? c : d) : e
以下为之前的原答案,为了大家知道评论区在说什么,特此保留
#include<stdio.h>
intmain(){
intx=1,y=2;
intc=0;
(x>y?printf("1"):(c==0)?printf("2"):printf("3"));/*这里就是从右到左结合
先把(c==0)?printf("2"):printf("3")当成一个整体
再把(x>y?printf("1"):(c==0)?printf("2"):printf("3"));当成一个整体*/
return0;
}
输出是2
‘叁’ c语言中条件运算 结合方向 从右到左 什么意思
在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。 但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式: int a,b=1,c=2; a=b=c; 我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2.类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
‘肆’ C语言逻辑运算符中有没有自右向左的 有的话最好举个例子
逻辑运算符中没有自右向左的
逻辑运算符包括! || && 三种, 都是从左向右的.
?:,=,*=,/=,+=,%=,-=,<<=,>>=,&=,^=,|=这些结合性都是自右向左
但是它们都不是逻辑运算
‘伍’ C语言中,什么情况下从左向右运算什么情况下从右向左运算是不是还有左右顺序的读取问题菜鸟!菜鸟!
这个要看运算符的优先级了,在同级的情况下,双目运算符都是左结合(从左向左运算),三目运算符都是又结合(从右向左运算);不同级情况下,先算级别高的。
‘陆’ C语言中的从右向左的运算问题
给你一个例子,你就应该明白了; int x; int y=4; x = y++; 这个的结果,相信你应该知道,x = 4,y =5; 也就是说对于表达式y++而言,它的值是未加之前的值4,也就是说(y++)的结果是4; 同理,对于x = *(p++),首先,(p++)这个表达式的结果是p,也就是说(p+1)并不影响(p++)这个表达式的结果,所以x = *p,; 这个是由于自加运算表达式的特性决定的,这样理解就不会有错了
‘柒’ C语言中自右向左结合的有哪些比方说:printf,条件运算符,那还有那些呢
从右到左的运算有:见图片,赋值,还有单目运算:
-负号运算符-表达式
(类型)强制类型转换(数据类型)表达式
++自增运算符++变量名/变量名++
--自减运算符--变量名/变量名--
*取值运算符*指针变量
&取地址运算符&变量名
!逻辑非运算符!表达式
~按位取反运算符~表达式
sizeof长度运算符sizeof(表达式)
‘捌’ C语言中什么情况下是从右向左运算的
C语言的入参是从右到左的,因此参数入栈的时候,是后进先出。这样第一个参数才能第一个出来,所以C语言支持可变数量参数,能够从左到右的顺序读取参数。
在C语言标准中好像并没有看到有关表述。参数入栈的方式应该是操作系统所实现,由gcc等编译器转换成机器语言。
作为一门跨平台的编程语言,一般都是很抽象的,尽量与底层脱钩。比如在C语言标准的文档,对字节,比特等的定义都是很抽象的,只是数据类型,与底层无关。
左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符。
例如:
int i = 1;
i = i << 2; //把i里的值左移2位
(8)c语言判断从右向左扩展阅读
1、左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位
2、符号位向右移动后,正数的话补0,负数补1。也就是汇编语言中的算术右移,同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位。
‘玖’ C语言中结合性自右向左怎么理解
C语言中结合性自右向左,简单说就是,从表达式右边开始执行;
1、只有同优先级的运算符才具有结合性“自左至右”或者“自右自左”一说。
2、exp(不同优先级运算符,依据优先级高低进行运算):
int a = 1, b =10, c = 30;
int a = a * b + c;
因为 * 比 + 的运算符优先级高,所以先计算a * b (先计算左边,未考虑结合性),在计算 10 + c,结果是 a = 300
3、c++标准对子表达式进行求值的次序没有做出规定,由各个c++编译器厂商自己决定(参见Bjarne Stroustrup所着的C++程序设计语言)。因此,开发人员不要编写依赖子表达式执行次序的代码,因为为了实现同样的功能,完全可以采用更为清晰的代码。
例如,语句int c=(a++)+(a++)+(a++);中给c赋值的表达式(a++)+(a++)+(a++)的求值。编写的目的是为了提高效率。
4、如果确实想钻研,那么根据Bjarne Stroustrup所说的“子表达式求值次序”,枚举各种可能,就可以理解所有不同结果的编译器行为。例如,上述语句int d=(++b)+(++b)+(++b);可以概念上表示为:int d=E1+E2+E3;(其中,E1,E2,E3是+运算符的同层次表达式,(E1+E2)和E3是+运算符的同层次表达式),其它同层次表达式可以同理)则其计算次序可以是:
1)E1(此时b=2)=>E2(此时b=3)=>E1+E2=b+b=6放入中间变量(此时b=3)=>E3
(此时b=4)=>d=10 对应VC的结果
2)E1(此时b=2)=>E2(此时b=3)=>E3(此时b=4)=>E1+E2=b+b放入中间变量(此时b=4)=>d=12 对应BC的结果;