文章随机晒最新文章关照最多的

jiayi Rss

C中从(int)看表达式“贪婪法”

| Posted in C/C++ |

12

在《Expert C Programming》中有这样一个表达式:apple = sizeof (int) * p;
第一反应是,先求得int类型的长度,然后与p相乘。可作者又抛出一种可能的解释,将p指向的内容转换成int,然后对其执行sizeof操作。到底那种解释正确,作者让读者自行解决……
其实这个问题的关键是,(int)被解释为( )运算符,还是被解释为(type)运算符。
以下为实验代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     char ch=‘a’;
  5.     int n=2;
  6.     char *p=&ch;
  7.     int apple1=sizeof((int) * p);
  8.     int apple2=sizeof (int) * n;  /*可以将其换成int apple2=sizeof (int) * p;看编译器有何反应*/
  9.     int apple3=n * (int) * p;
  10.     printf("apple1 is %dn",apple1);
  11.     printf("apple2 is %dn",apple2);
  12.     printf("apple3 is %dn",apple3);
  13. } 

该程序运行结果:
        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

Comments (12)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Write a comment

You must be logged in to post a comment.