`
zhouxiaoli521
  • 浏览: 555078 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言自增/自减运算符

阅读更多

看到一个例子关于C语言++/--的例子

main(){ 
    int i=5,j=5,p,q; 
    p=(i++)+(i++)+(i++); 
    q=(++j)+(++j)+(++j); 
    printf("%d,%d,%d,%d",p,q,i,j); 
}

 

我自己算的结果是:18,21,8,8

然后程序输出的结果是:15,24,8,8

结果完全不一样!好吧 我承认 我是用java的语法来算的,我记得java和c关于“++/--”的用法是一样的,以“i++”为例是“先取值在加1”,“++i”是“先加1在取值”;

这让我很费解,于是经过一番查阅,终于有所了解。

写道
C语言允许在一个表达式中使用一个以上的赋值类运算,包括赋值运算符、自增运算符、自减运算符等。这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一:有的认为是9(3+3+3,如谭浩强的《C程序设计》,清华大学出版社,1991);也有的认为是12(3+4+5,如王森的《C语言程序设计》,电子工业出版社,1995)。到底哪一个说法正确呢?不妨看看下面这个程序的运行情况:
  main( )
  {int i,j;
  i=3; j=(i++)+(i++)+(i++); printf(“\nj=%d,”j);
  i=3; printf(“j=%d”,(i++)+(i++)+(i++));
  }
  在TC3.0上运行,其结果则是:j=9,j=12,究其原因,“先用后变,先变后用“中的“先”和“后”是一个模糊的概念,很难给出顺序或时间上的准确定论。“先”到什么时候,“后”到什么程度?没有此方面的详细资料可供查询。
  为此,笔者用各种表达式上机测试,结果发现当表达式的值作为printf函数的直接输出对象时,“先变后用”和“先用后变”中的“后”就是指++i和i++这一小项运算完之后,如上面程序中最后一个语句中的输出对象:第一个(i++)取出i的值3以后i立即变为4,第二个(i++)取出i的值4以后i立即变为5,第三个(i++)取出i的值5以后i立即变为6,这样输出的结果便是3+4+5这个表达式的值,即12。

 在printf函数中输出的表达式和我预想的结果是一样的,那在其它的地方呢?执行顺序是什么样的?又经过一番查找发现

写道
必须要把握住这样的一条原则:++/一一运算符前置时优先级最大,在参与运算的所有其它运算符运算前运算;后置时的优先级最小,要在所有其它的运算符执行完毕后再来运算它。

 这样我就能理解p=(i++)+(i++)+(i++)为什么等于15 因为是后置自增运算符,它的优先级最低,所以先执行的是三个i相加,然后才是i的三次自增。

 

究其原因还是因为自己基础不扎实。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics