有如下语句:
x=y=z=0;
++x||++y&&++z;
结果为什么是 x=1 y=0 z=0? 这样是从左向右计算的结果 但是 看书上说 &&的优先级大于|| 不应该先算后面的&&吗?这样结果就不一样了
求解 谢谢
ããç»è¿néçè°è¯ï¼è¯æï¼
ãã1ã||å&&ä¼å 级ç¸çï¼ä¸é½æ¯ä»å·¦å¾å³è¿ç®
ãã2ãå¨åºç°||å&&çè¯å¥ä¸ï¼å¹¶ä¸å¯¹a++è¿è¡è¿ç®ï¼åªå¤æå®çåå¼ãå½ç¶ï¼è¿æ¡è¯å¥ç»æåï¼æ¶åå¤æç表达å¼å°±ä¼è¿è¡ç¸åºçè¿ç®ï¼å¦ï¼a++ï¼ã
ãã3ãå¨&&è¿ç®ä¸ï¼å¦æ&&åé¢çé»è¾å¼ä¸º0ï¼å¦ï¼ä»¤a=0; a++&&b++,æ¤æ¶ï¼aè¿æ²¡æè¿è¡++è¿ç®ï¼ä»ä¸º0ãä½æ¯å¨æ¬è¯å¥ç»æåå°±èªå 1ï¼ï¼åç»ææ¬è¯å¥ï¼å¦æ&&åé¢çé»è¾å¼ä¸º1ï¼å¦ï¼ä¸é¢çæ åµä»¤a=1),å继ç»å¤æ&&åé¢çå¼æ¯å¦ä¸º1ï¼å¦æ为1ï¼å继ç»å¤æåé¢çé»è¾è¿ç®ï¼å¦æ为0ï¼èç»ææ¬è¯å¥ã
ãã4ãå¨||è¿ç®ä¸ï¼å¦æ||åçé»è¾å¼ä¸º1ï¼åç»ææ¬è¯å¥å¦æ||åçé»è¾å¼ä¸º0ï¼å继ç»å¤æï¼è¥||åçé»è¾å¼ä¸º1ï¼å¦ï¼a||b++, å ¶ä¸b=1ï¼ï¼åç»ææ¬è¯å¥ï¼å¦å继ç»å¾åå¤æ举个å®é çä¾åï¼#include<stdio.h>
void main()
{
int a,b,c,d;
a=0;
b=0;
c=1;
d=a++||b++&&c++; /*
ããè¿ç®è¿ç¨æ¯ï¼
ãã第ä¸æ¥ï¼å¤æa çé»è¾å¼æ¯å¦ä¸º0ï¼å¯ç¥ä¸º0ï¼å æ¤ç»§ç»å¾åå¤æï¼å 为a++è¿ä¸ªè¡¨è¾¾å¼åä¸äºå¤æï¼æ以å¨è¿æ¡è¯å¥ç»æåï¼aä¼åæ1ï¼ï¼
ãã第äºæ¥ï¼å¤æbï¼å¯ç¥bçé»è¾å¼0ï¼æ以a||b==0ï¼å 为ä¹åéå°çæ¯&&è¿ç®ï¼èåæ&&åçé»è¾å¼ä¸º0ï¼ç´æ¥ç»ææ¬è¯å¥ï¼å æ¤C++并没æåä¸å¤æï¼ä¿æå¼ä¸åï¼å½ç¶ï¼bæåå å¤æï¼ç»ææ¬è¯å¥åï¼b为1ï¼ï¼
ãã第ä¸æ¥ï¼ç±äº0&&c++==0ï¼æ以d=0*/
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}è¿è¡ç»æï¼a=1b=1c=1d=0
ãã1ã||å&&ä¼å 级ç¸çï¼ä¸é½æ¯ä»å·¦å¾å³è¿ç®
ãã2ãå¨åºç°||å&&çè¯å¥ä¸ï¼å¹¶ä¸å¯¹a++è¿è¡è¿ç®ï¼åªå¤æå®çåå¼ãå½ç¶ï¼è¿æ¡è¯å¥ç»æåï¼æ¶åå¤æç表达å¼å°±ä¼è¿è¡ç¸åºçè¿ç®ï¼å¦ï¼a++ï¼ã
ãã3ãå¨&&è¿ç®ä¸ï¼å¦æ&&åé¢çé»è¾å¼ä¸º0ï¼å¦ï¼ä»¤a=0; a++&&b++,æ¤æ¶ï¼aè¿æ²¡æè¿è¡++è¿ç®ï¼ä»ä¸º0ãä½æ¯å¨æ¬è¯å¥ç»æåå°±èªå 1ï¼ï¼åç»ææ¬è¯å¥ï¼å¦æ&&åé¢çé»è¾å¼ä¸º1ï¼å¦ï¼ä¸é¢çæ åµä»¤a=1),å继ç»å¤æ&&åé¢çå¼æ¯å¦ä¸º1ï¼å¦æ为1ï¼å继ç»å¤æåé¢çé»è¾è¿ç®ï¼å¦æ为0ï¼èç»ææ¬è¯å¥ã
ãã4ãå¨||è¿ç®ä¸ï¼å¦æ||åçé»è¾å¼ä¸º1ï¼åç»ææ¬è¯å¥å¦æ||åçé»è¾å¼ä¸º0ï¼å继ç»å¤æï¼è¥||åçé»è¾å¼ä¸º1ï¼å¦ï¼a||b++, å ¶ä¸b=1ï¼ï¼åç»ææ¬è¯å¥ï¼å¦å继ç»å¾åå¤æ举个å®é çä¾åï¼#include<stdio.h>
void main()
{
int a,b,c,d;
a=0;
b=0;
c=1;
d=a++||b++&&c++; /*
ããè¿ç®è¿ç¨æ¯ï¼
ãã第ä¸æ¥ï¼å¤æa çé»è¾å¼æ¯å¦ä¸º0ï¼å¯ç¥ä¸º0ï¼å æ¤ç»§ç»å¾åå¤æï¼å 为a++è¿ä¸ªè¡¨è¾¾å¼åä¸äºå¤æï¼æ以å¨è¿æ¡è¯å¥ç»æåï¼aä¼åæ1ï¼ï¼
ãã第äºæ¥ï¼å¤æbï¼å¯ç¥bçé»è¾å¼0ï¼æ以a||b==0ï¼å 为ä¹åéå°çæ¯&&è¿ç®ï¼èåæ&&åçé»è¾å¼ä¸º0ï¼ç´æ¥ç»ææ¬è¯å¥ï¼å æ¤C++并没æåä¸å¤æï¼ä¿æå¼ä¸åï¼å½ç¶ï¼bæåå å¤æï¼ç»ææ¬è¯å¥åï¼b为1ï¼ï¼
ãã第ä¸æ¥ï¼ç±äº0&&c++==0ï¼æ以d=0*/
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}è¿è¡ç»æï¼a=1b=1c=1d=0
温馨提示:答案为网友推荐,仅供参考
第1个回答 2012-06-12
第一步,是自右向左赋值,使得xyz都为0.
第二步,因为&&优先级高所以把第二个式子看成++x||(++y&&++z),然后再看||,由于或运算的结合方向是自左向右,所以先进行左边的++x,使x变为1,此时整个式子为true,就不用进行后面且运算了(计算机也是只要看到||,先算左边,如果左边卫true,那么右边的就不执行了)
第二步,因为&&优先级高所以把第二个式子看成++x||(++y&&++z),然后再看||,由于或运算的结合方向是自左向右,所以先进行左边的++x,使x变为1,此时整个式子为true,就不用进行后面且运算了(计算机也是只要看到||,先算左边,如果左边卫true,那么右边的就不执行了)
第2个回答 推荐于2016-06-05
先++x,使得x变为1,此时++x为true(因为不等于0),那么,||是或的意思,只要++x为true了,不管||后面是什么,都不执行。
所以,++y && ++z都不会执行。
这种求值策略为“短路求值”。本回答被提问者采纳
所以,++y && ++z都不会执行。
这种求值策略为“短路求值”。本回答被提问者采纳