ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

cÓïÑÔ×Ô¼ÓÎÊÌâ
2014-11-24 01:23:08 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:4251´Î
Tags£ºÓïÑÔ ÎÊÌâ

¿´¼ûÓиöÃæÊÔÌâÄ¿£¬Çóx, yµÄÖµ£º
int i = 3, j = 3;
int x = (++i) + (++i) + (++i);
int y = (j++) + (j++) + (j++);


¿´µ½Í¦¶àÈËÔÚÕùÂÛ£¬ÕâÑùµÄ±í´ïʽֵӦ¸ÃÊǶàÉÙ£¿ÉõÖÁÄóö¼¸¸ö²»Í¬µÄ±àÒëÆ÷À´±àÒëÔËÐеõ½¼¸¸ö²»Í¬µÄ½á¹û¡£¶ÔÓÚ´ËÌâµÄ´ð°¸£¬Ò»¾ä»°£¬The behavior is undefined! Ïêϸ½âÊÍ´ýÎÒÂýÂý˵À´¡£


´ó¼ÒÖªµÀ£¬Í¨³£¶øÑÔ£¬ÎÒÃÇдµÄ¼ÆËã»ú³ÌÐò¶¼ÊÇ´ÓÉϵ½Ï£¬´Ó×óµ½ÓÒÒÀ´ÎÖ´ÐС£È»¶ø£¬ÎÒÖ»ÊÇ˵ͨ³££¬ÒòΪÔÚ±àÒëµÄ¹ý³ÌÖУ¬compiler²¢²»½ö½öÊÇ°Ñsource code·­Òë³Ébinary code¾ÍËãÁË£¬Õâ¸ö¹ý³ÌÀïÃæ¿ÉÄÜ»¹»á¶Ô´úÂë½øÐÐÓÅ»¯£¬ÕâÖÖÓÅ»¯¿ÉÄÜ´øÀ´µÄ½á¹ûÊÇ£º´úÂë»òÕß±í´ïʽeva luationµÄ˳Ðò¿ÉÄÜ·¢Éú±ä»¯¡£Õâ¿ÉÊÇÒ»¸ö·Ç³£ÑÏÖصÄÎÊÌ⣬µ±Ä³¸ö±í´ïʽ´øÓÐside-effect£¨±ÈÈç¸Ä±äÁËÒ»¸ö±äÁ¿µÄÖµ£©£¬ÄÇôËüµÄÖ´ÐÐ˳ÐòÖ±½ÓÓ°Ïìµ½Á˳ÌÐòÖ´ÐеĽá¹û¡£


ΪÁ˱£Ö¤³ÌÐòÖ´ÐоßÓÐÈ·¶¨ÐԵĽá¹û£¬C++±ê×¼ÒýÈëSequence PointÕâ¸ö¸ÅÄ°´ÕÕISO/IECµÄ¶¨Ò壺


At certain specified points in the execution sequence called sequence points. All side effects of previous eva luations shall be complete and no side effects of subsequent eva luations shall have taken place.


¼ò¶øÑÔÖ®£¬Sequence Point¾ÍÊÇÕâôһ¸öλÖã¬ÔÚËü֮ǰËùÓеÄside effectÒѾ­·¢Éú£¬ÔÚËüÖ®ºóµÄËùÓÐside effectÈÔδ¿ªÊ¼£¬¶øÁ½¸öSequence PointÖ®¼äËùÓеıí´ïʽ»òÕß´úÂëÖ´ÐеÄ˳ÐòÊÇ䶨ÒåµÄ£¡


¶øC++±ê×¼ÓÖ½øÒ»²½¹æ¶¨ÁËSequence Point³öÏÖµÄ5ÖÖÇé¿ö£º


At the end of a full expression
After the eva luation of all function arguments in a function call and before execution of any expressions in the function body
After copying of a returned value and before execution of any expressions outside the function
After eva luation of the first expression in a&&b, a||b, a b:c, or a,b
After the initialization of each base and member in the constructor initialization list
¾ßÌåÎÒ²»ÏêϸÌÖÂÛ£¬Ö»¿´µÚÒ»¸öÇé¿ö£ºAt the end of a full expression£¬ÕâÀï¼ò»¯ÎÊÌ⣬full expression¼òµ¥ÈÏΪÊÇÒ»¸ö´øÓÐ;µÄÓï¾ä£¨¾ßÌå¿ÉÒÔÔÙÈ¥²é±ê×¼£©¡£Ò²¾ÍÊÇ˵£¬ÈκÎÒ»¸ö¶ÀÁ¢µÄ±í´ïʽÓï¾äµÄ½áÊø¶¼ÊÇÒ»¸öSequence Point£¬»Øµ½ÎÒÃǵÄÌâÄ¿£º


int y = (++i) + (++i) + (++i);


Õû¸öµÄÓï¾äÀïÃ棬ֻÓÐ1¸öSequence Point£¬Ò²¾ÍÊÇÓï¾äµÄ½áÊøµã£¬¶ÔÓÚÓұ߱í´ïʽµÄ¼ÆËã˳ÐòûÓÐÈκεĹ涨£¬ÏÔÈ»£¬¸÷ÖÖ±àÒëÆ÷¶¼¿ÉÒÔ°´ÕÕËûÃǾõµÃ¡°Êæ·þ¡±µÄ·½Ê½À´½øÐмÆË㣬ÕâÑùµÄ´úÂ룬Èç¹ûÖ»ÒªÇóÔÚÌض¨µÄƽ̨»òÕß±àÒëÆ÷ÔËÐУ¬ÄÇô´øÀ´µÄ¿ÉÄÜÖ»ÊǿɶÁÐÔ²îµÄÎÊÌ⣬µ«Èç¹û¿¼ÂÇ¿çƽ̨»òÕß±àÒëÆ÷µÄÇé¿ö£¬ÄÇô¾ÍÊÇÍêÍêÈ«È«µÄ´íÎó£¡


ÁíÍ⣬ÐèÒªÌرð×¢ÒâµÄÊÇ£¬¶ÔÓÚ¸³ÖµºÅ(assignment operator)£¬C++ҲûÓаÑËü¶¨Òå³ÉSequence Point£¬Ò²¾Í˵ÕâÑùµÄÓï¾ä£º


buffer = i++;


ͬÑùÊÇundefinedµÄ£¬ÒòΪ£¬¶ÔÓڵȺÅ×óÓÒÁ½±ßµÄ±í´ïʽÔËËã˳Ðò£¬Äã²¢²»ÄÜÓÐÈκεļٶ¨¡£


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºvc++ÃæÊÔÌâ ÏÂһƪ£ºc++µç»°ÃæÊÔÌ⼯½õ

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿