如果å‰ç¼€å¢žé‡è¿ç®—符具有从å³åˆ°å·¦çš„å…³è”性,这怎么å¯èƒ½ï¼Ÿ

时间:2017-08-06 19:24:57

标签: c

 main()
   {
      int i=-3, j=2;
      int m = ++i || ++j;
      printf("%d %d",i,j);
   }

如果å‰ç¼€å¢žé‡è¿ç®—符具有从å³åˆ°å·¦çš„å…³è”性,则应首先执行++ j。但这里åªæœ‰++我执行而++ j没有。为什么呢?

2 个答案:

答案 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)(å¦æœ‰è¯´æ˜Žï¼Œå‡æ³•æ˜¯å·¦å…³è”的)。

评估顺åºç”±åºåˆ—点定义。在完整表达å¼çš„末尾有一个åºåˆ—点(除其他外)。在åºåˆ—点,必须进行所有先å‰çš„评估,并且尚未进行任何åŽç»­è¯„估。