在《Expert C Programming》中有这样一个表达式:apple = sizeof (int) * p;
第一反应是,先求得int类型的长度,然后与p相乘。可作者又抛出一种可能的解释,将p指向的内容转换成int,然后对其执行sizeof操作。到底那种解释正确,作者让读者自行解决……
其实这个问题的关键是,(int)被解释为( )运算符,还是被解释为(type)运算符。
以下为实验代码:
-
#include<stdio.h>
-
int main()
-
{
-
char ch=‘a’;
-
int n=2;
-
char *p=&ch;
-
int apple1=sizeof((int) * p);
-
int apple2=sizeof (int) * n; /*可以将其换成int apple2=sizeof (int) * p;看编译器有何反应*/
-
int apple3=n * (int) * p;
-
}
该程序运行结果:
apple1 is 4
apple2 is 8
apple3 is 194
由结果不难得出结论:编译器遇到"(",首先看其能否与其左侧的对象或者运算符组成表达式,如果能,则解释为优先级最高的( )运算符,如果不能组成表达式,则解释为(type)运算符。
第8句,编译器应该这样解释:sizeof 是一运算符,遇到"(",又有“)”与之对应,可以组成表达式,所以(int)被分解为( )运算符和int作为参数,后面就是与p进行一个乘法运算。
第9句,n是一左操作数,“*"是乘法运算符,而其右的“(”无法与之组成表达式,所以(int)被解释为(type)运算符与其右的*p结合,*p被解释为p所指向的内容。
感觉这个过程类似于词法分析中的“贪婪法”,jiayi在这里姑且偷偷认为是表达式的“贪婪法”
……有不对之处,大虾们拍~
有篇介绍sizeof的文章很好,也记下来:http://blog.chinaunix.net/u/20828/showart_438003.html
转载请注明出处:http://www.jiayii.com/multi-oprator-expressions/
谢谢您的关注。 : @jiayisuse : jiayisuse#gmail.com


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Reply]