2013-12-11 26 views
-4
#include<stdio.h> 
#define max(a) ((++a)*(++a)*(++a)) 
main(){ 
int a=5; 
printf("%d\n",max(a)); 
printf("%d",a); } 

這應該返回6 * 7 * 8但它返回7 * 7 * 8爲什麼?無法理解inc/dec操作符在c語言宏中的行爲

+2

[未定義的行爲](http://en.wikipedia.org/wiki/Undefined_behavior)由於缺乏[sequence point](http://en.wikipedia.org/wiki/Sequence_point)。 –

+0

這不是一個真正的宏觀問題。這是生成的代碼的一個問題,如果直接輸入它將會是假的。 – RichardPlunkett

回答

3

標準說如果您在序列點之間多次修改變量,您會得到未定義的行爲。這就是你所做的,所以這就是你得到的。

需要注意的是:

1)您有關於(++a)*(++a)*(++a)評估的順序沒有承諾,除了操作(乘)被它的參數計算後進行(++ a)所示。

2)您明確不允許在序列點之間多次修改相同的變量。