请看下面一段程序,VC++环境下:
#include
#include
static int var1 = 7;
static int var2 = 7;
void main(void)
{
while(getchar() != '0')
{
var1 = (var1 == 0) ? 7 : (var1-1);
var2 = (var2 == 0) ? 7 : (var2--);
printf("var1 = %d\n",var1);
printf("var2 = %d\n",var2);
}
}
程序的本意是,按下键盘,var1,var2减一,若等于0,则var1、var2又等于7,按下键盘‘0’则退出。
程序的运行结果却是:
var1 = 6
var2 = 7
var1 = 5
var2 = 7
var1 = 4
var2 = 7
var1 = 3
var2 = 7
var1 = 2
var2 = 7
var1 = 1
var2 = 7
var1 = 0
var2 = 7
var2的值保持不变,为社么呢?经过思考,本人认为是这样的:
var2 = (var2 == 0) ? 7 : (var2--);
这条语句在编译时,先执行等号右边的值,即执行条件表达式 (var2 == 0) ? 7 : (var2--) 这个表达式的值为 7,编译器在执行时,把这个表达式的值存到堆区,再执行 var2 = var2 -1,这时var2 = 6,接着执行的是把条件表达式的值赋给var2,编译器直接从堆区取出这个值赋给var2,这样var2 = 7.所以每次执行的结果都是7了。若想达到程序的本意。只需把语句改成
var2 = (var2 == 0) ? 7 : (--var2);
就行了,这样就不会出现上面的现象。
阅读(1344) | 评论(1) | 转发(0) |