main()
{
int i=-3, j=2;
int m = ++i || ++j;
printf("%d %d",i,j);
}
如果å‰ç¼€å¢žé‡è¿ç®—符具有从å³åˆ°å·¦çš„å…³è”性,则应首先执行++ j。但这里åªæœ‰++我执行而++ j没有。为什么呢?
ç”案 0 :(得分:5)
您的观察与è¿ç®—符关è”æ€§æ— å…³ï¼Œè€Œä¸ŽäºŒè¿›åˆ¶é€»è¾‘è¿ç®—符的执行顺åºçš„å®šä¹‰æ— å…³ã€‚
您æ£åœ¨ä½¿ç”¨++ j作为逻辑æ“作的第二个è¿ç®—符。在Cä¸ï¼ŒäºŒè¿›åˆ¶é€»è¾‘è¿ç®—符具有"æå‰é€€å‡ºï¼†ï¼ƒ34;,也就是说,åªè¦è¿›ä¸€æ¥æ‰§è¡Œä¸å†æ”¹å˜ç»“果,执行就会åœæ¢ã€‚当||çš„å·¦æ“作数时就是这ç§æƒ…况评估为TRUE,或左å³æ“作数&&评估为FALSE。在å‰ä¸€ç§æƒ…å†µä¸‹ï¼Œæ— è®ºå…¶ä»–æ“作数产生什么,结果都为TRUE。在åŽä¸€ç§æƒ…况下,它是错误的,进一æ¥çš„评估ä¸ä¼šæ”¹å˜å®ƒã€‚
如果您将函数用作逻辑è¿ç®—符的æ“作数,则æ¤è¯è¨€åŠŸèƒ½éžå¸¸é‡è¦ã€‚它ä¿è¯ä»¥æŒ‡å®šçš„顺åºè°ƒç”¨å‡½æ•°ï¼Œå¹¶ä¸”åªè¯„估那些对结果有贡献的函数。
在您的示例ä¸ï¼Œæ‚¨è¯„估:
int m = ++i || ++j;
由于i == -3,++ i得到-2,它ä¸æ˜¯0ï¼Œå› æ¤è¢«è§£é‡Šä¸ºTRUE。所以评价||åœåœ¨è¿™é‡Œï¼Œj没有碰到。
ç”案 1 :(得分:2)
ä½ é”™äº†åŽç¼€å¢žé‡è¿ç®—符从左到å³çš„å…³è”性。
如果您ä»æœ‰ç–‘问,请查看以下链接:http://en.cppreference.com/w/cpp/language/operator_precedence
编辑:
å‰ç¼€è¿ç®—符具有从å³åˆ°å·¦çš„å…³è”性,但优先级和关è”性ä¸ä¼šå‘Šè¯‰æ‚¨è¯„估的顺åºã€‚他们åªå‘Šè¯‰ä½ 有关分组的信æ¯ã€‚例如,优先级是指使用 b + c被分组为(a b)+ c而ä¸æ˜¯*(b + c)。编译器å¯ä»¥æŒ‰ç…§å®ƒè®¤ä¸ºé€‚åˆçš„任何顺åºè‡ªç”±åœ°è¯„ä¼°a,bå’Œc。当您拥有相åŒä¼˜å…ˆçº§çš„è¿ç®—符(通常是相åŒçš„è¿ç®—符)时,关è”性会告诉您有关分组的信æ¯ã€‚ä¾‹å¦‚ï¼Œå®ƒå‘Šè¯‰ä½ a-b-cç‰ä»·äºŽï¼ˆa-b)-c,而ä¸æ˜¯a-(b-c)(å¦æœ‰è¯´æ˜Žï¼Œå‡æ³•æ˜¯å·¦å…³è”的)。
评估顺åºç”±åºåˆ—点定义。在完整表达å¼çš„末尾有一个åºåˆ—点(除其他外)。在åºåˆ—点,必须进行所有先å‰çš„评估,并且尚未进行任何åŽç»è¯„估。