逗号运算符优先级,逗号运算符优先级怎么算

http://www.itjxue.com  2023-01-21 19:45  来源:未知  点击次数: 

在C语言中,逗号运算符的优先级最低吗?

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

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

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

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

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

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

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

"三分天下"八九十;??

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

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

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

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

由于C语言的运算符优先级与C++的不完全一样(主要是增加了几个运算符),所以这个口诀不能完全实用于C++.但是应该能够兼容,大家可以比较一下他们的区别应该就能够很快掌握C++的优先级的!

((*strDest++=*strSrc++)!='\0');??:

重点:++后增运算符优先级高于*

1.*strDest++相当于*(strDest++)

2.由于是后自增,故执行顺序为:

*strDest=*strSrc

strDest++strsrc++?//该级顺序不明

将*strDest与'\0'比较//即,整个表达式的值为*strDest与'\0'的比较结果

值得注意的是,对于赋值表达式,表达式本身的值等于左边子表达式的值。

通过以上深入的分析,我们知道这个表达式完成了以下多个功能:

1.对于指针strDest,strSrc,将strSrc所指的内存空间的值赋给由strDest所指的内存空间。

2.判断赋值后的strDest所指的内存空间的指是否等于0。

3.对于指针strDest,strSrc,他们的值分别加1,即指向下一个元素。

即:该表达式实现了以下三个功能:

1.对于指针strDest,strSrc,将strSrc所指的内存空间的值赋给由strDest所指的内存空间。

2.判断赋值后的strDest所指的内存空间的值是否等于0。

3.对于指针strDest,strSrc,他们的值分别加1,即指向下一个元素。

关于逗号运算符和++的优先级

你的这2个问题不仅牵扯到了操作符的优先级还牵涉到了顺序点的问题,你可以了解下顺序点的概念:顺序点的意思是在一系列步骤中的一个“结算”的点,语言要求这一时刻的求值和副作用全部完成,才能进入下面的部分。

从你的例子来说,第一个问题中','的优先级是最低的,它的执行顺序是从左到右,因此y++和++y是优先执行然后再从左至右进行的。

但你可能会认为y++是在整个语句执行完毕后才进行自增1的,这一点来说是不对的。因为','是一个顺序点,也就是所谓的结算点,在这点之前的操作都要完成,所以此时y++已经增加1,这样y在整个表达式结束前已经增加了2次,所以结果是3,没有问题。

至于第二个例子,我觉得你这样的写法不够规范。顺序点的另一个规则:在两个顺序点之间,子表达式求值和副作用的顺序是不同步的。如果代码的结果与求值和副作用发生顺序相关,称这样的代码有不确定的行为(unspecified behavior).而且,假如期间对一个内建类型执行一次以上的写操作,则是未定义行为.

简单来说就是2个顺序点内,同优先级的操作执行顺序是未知的,依赖于编译器的实现。具体哪一个操作谁先发生谁后发生,谁也不知道,在编程中必须要注意并加以回避。

我举个例子,int?i=0;int m=(++i)+(++i)+(++i)+(++i);printf("%d %d\n",m,i);

在gcc编译器中运行得到的结果是 11 4

而在Visual Studio 2008中运行得到的结果是?16 4

从这个例子就可以看出,不同的编译器,对于一个表达式内(2个顺序点之间)的执行顺序是不一样的。对于这种依赖编译器的情况是必须避免的,是相当不规范的编程。

我觉得你的第二例子有点过于依赖编译器了,换一个编译器就可能是其他的结果了,并不一定是你解释的那样发生的。在正式编程里,千万不要在一个表达式中用一个值会发生变化的变量2次以上,如a[i++]=i;等,都可能引起问题。

最后说一下,顺序点并不是一种技巧,而是辅助编译器的运算顺序制定的一个规则。它不是让你利用这个特点写出特殊的表达式,而是让你尽可能不写出这种特殊的带歧义的表达式。

【顺序点参考】?

运算符的优先级从高到低是怎样的?

优先级【高到低】:

第一级:圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【-】、结构体成员运算符【.】。

第二级:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和】、长度运算符【sizeof】。

第三级:乘法运算符【*】、除法运算符【/】、取余运算符【%】。

第四级:加法运算符【+】、减法运算符【-】。

第五级:左移动运算符【】、右移动运算符【】。

第六级:关系运算符【 = = 】。

第七级:等于运算符【==】、不等于运算符【!=】。

第八级:按位与运算符【】。

第九级:按位异或运算符【^】。

第十级:按位或运算符【|】。

第十一级:逻辑与运算符【】。

第十二级:逻辑或运算符【||】。

第十三级:条件运算符【?:】。

第十四级:赋值运算符【= += -= *= /= %= = .= = |= ^=】。

第十五级:逗号运算符【,】。

扩展资料

优先级与求值顺序无关。如(a+b)(b*c),虽然*优先级最高,但这个表达式求值顺序是从左到右。优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。

相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。

基本的优先级需要记住:指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。13+27等价于 (1(3+2))7。逻辑运算最后结合。

参考资料来源:百度百科-运算符

参考资料来源:百度百科-运算符优先级

在C语言中,逗号运算符的优先级是最低的吗?

一共有十五个优先级:

1 () [] . -

2 ! ~ -(负号) ++ -- (取变量地址)* (type)(强制类型) sizeof

3 * / %

4 + -

5

6 = =

7 == !=

8

9 ^

10 |

11

12 ||

13 ?:

14 = += -= *= /= %= |= ^= = = =

15 ,

就着多吧 结合性:2 13 14 是从右至左 其他都是 从左至右

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

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

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

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

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

"三分天下"八九十;

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

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

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

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

(责任编辑:IT教学网)

更多

推荐windows vista文章