一道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;
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++语言中這样做还可以满足其确定动态参数的个数等功能。