Chinaunix首页 | 论坛 | 博客
  • 博客访问: 265425
  • 博文数量: 49
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-08 10:33
文章分类

全部博文(49)

文章存档

2010年(2)

2009年(30)

2008年(17)

我的朋友

分类: C/C++

2009-05-12 18:46:23

请看下面一段程序,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);
 
就行了,这样就不会出现上面的现象。
 
 
 
 
阅读(1347) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-08-24 15:54:49

var2 = (var2 == 0) ? 7 : (--var2); 在统一表达式中有两个位点对VAR2操作,会引起未定义的行为