看到一个例子关于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的三次自增。
究其原因还是因为自己基础不扎实。。
分享到:
相关推荐
c语言自增与自减运算符共2页.pdf.zip
探讨C语言自增、自减运算符的应用
C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题: #include void main() /*主函数*/ { int a,b,c,d; a=5; b=5; c=...
1.掌握C语言算术、赋值、自增、自减运算符及相应表达式 2.掌握不同类型数据之间的赋值规律 3.了解强制数据类型转换以及运算符的优先级、结合性 4.学会根据表达式,编写相应程序,验证表达式结果的方法
探讨C语言中自增、自减运算符.pdf
C语言的自增_自减运算符探析.pdf
试析二级C语言之自增、自减运算符.pdf
解析C语言中自增自减运算符.pdf
浅析C语言中自增自减运算符的使用问题
C语言中自增自减运算符的使用.pdf
C语言中自增自减运算符教学探究.pdf
C语言自增(自减)运算符运算规律的探讨.pdf
浅谈C语言中自增自减运算符的应用.pdf
C语言中自增自减运算符的应用与解析.pdf
C语言自增自减运算符的解析与应用.pdf
关于C语言自增自减运算符的灵活使用.pdf
C语言中自增自减运算符在表达式和函数中的应用.pdf
C语言自增运算符的置于变量前和变量后的区别与理解自加自减运算符的概念:在普通语句定义并用printf函数输出结果for循环中作为判断条件结语Reference 自加自减运算符的概念: 自增自减运算符存在于C/C++/C#/Java/...
介绍Java和C语言中的自增和自减区别,如a++和a--的区别。