您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页一道c语言运算符优先级问题

一道c语言运算符优先级问题

来源:爱玩科技网

一道c语言运算符优先级问题<?xml:namespace prefix = o />

#include <iostream>

using namespace std;

 

int main()

{

         char test[] = {“This is testing.”}, *p = test;

         int i,j;

         i = 2,j=5;

//print

cout<<*p<<*p++<<endl; // 输出为 h T

cout<<i<<j<<endl; //输出为: 2,5

cout<<i<<i++<<endl; //输出为:3,2

 

p = test;

cout<<*p<<*++p<<endl; //输出为:h h

 

i = 2;

cout<<i<< --i<<endl; //输出为:1 1

 

i = 2;

printf(“%d,%d”,i,i++); //输出为:3,2

         getchar();

         return (0);

}

 

解析

面对:cout<<*p<<*p++<<endl;这样一个语句,初一看输出结果应该是:T h  但是实测结果是 h  T ,刚好相反! 为什么呢? 其实这是个运算符优先级问题。

1.要知道不论是 cout<<….<<endl; 还是 printf(); 其参数入栈顺序都是自右至左!,输入时从左至右输出。例如:

 

2.上面说到入栈是自右至左进行的,其实计算也是自右至左进行的,但是并不是计算一个就入栈一个,而是先自右至左计算全部表达式完毕,然后再自右至左依次入栈。比如:

cout<<*p<<*p++<<endl;

现在知道cout<<*p<<*p++<<endl;为什么输出来是 h T 而不是期待的 T h 了吧。

之所以会出现這中情况是是因为cout<<…..<<endl; 是自右向左进行计算和入栈的。 如果先把*p *p++的值单独赋值给两个变量,那么输出来的就可以是 T h 了。

cout<<i<<j<<endl;

 

 

接着看:cout<<i<<i++<<endl;  这里和上面就是一样了, 知道i初始化为2,那输出则为3,2.

 

这里要明白:

自增运算符在前面就要运算再使用

 

接着看下面 cout<<*p<<*++p<<endl;,应该立刻就知道答案了。

p = test;

cout<<*p<<*++p<<endl; //输出为:h h

 

下面的这两个也就可以同理分析了。

i = 2;

cout<<i<< --i<<endl; //输出为:1 1

 

i = 2;

printf(“%d,%d”,i,i++); //输出为:3,2

 

总结

2.声明指针时,要立即赋值为NULL, char *ptr = NULL;  如果是 char *ptr; 则会造成ptr指向不明,变成野指针。

3.要知道函数参数的计算方向,一般都是自右向左进行的。如cout<<endl; 因为只有这样才能保证出栈时的顺序和书写时的顺序一致! 比如你现在入栈是自左向右入栈,那现在第一个值被入栈到栈底了, 然后接着入栈其它的内容,最后要出栈的时候,你是要先取出第一个值吧,但是这个值被按自左向右入栈已经入栈到栈底了,這样你要取出来不是多麻烦的,自右向左入栈就要简单多了,直接出栈就可以了,因为最上面的就是第一个,然后这里的自右向左入栈的和计算的方向,不仅仅是满足这个方便,在c/c++语言中這样做还可以满足其确定动态参数的个数等功能。

转载于:https://www.cnblogs.com/AI-Algorithms/p/3793679.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务