在宏定义#define PI 3.1415926中,3.1415926是一个字符串,那么在编译程序时,如果3.1415926参与算术运算,按理应该是不能进行的,因为字符串怎么能参与算术运算呢?而事实上3.1415926就参与了算术运算,这该怎么解释?
解释一: 这个问题我是这么看的,所有的源代码用人的眼光来看,都是字符,因为如果你不把它拿到机器上调试的话,它只是大量符号的组合。但从机器,确切说是编译系统的角度来看,就不全是字符了,是不是字符编译系统有严格的鉴别机制,就拿“3.1415926”来说,如果在源代码中以 "3.1415926"的形式出现,那么编译系统一定认为它是一个字符串,如果以 3.1415926 的形式出现,则认为是数值。
宏定义中宏名后的东西不管是什么,都被认为是一串字符,这是语言规定的,为什么这么规定我不清楚。比如#define PI 3.1415926中的3.1415926是一串字符,#define PI "3.1415926"中的 "3.1415926"也是一串字符。
调试程序时,在预编译阶段,宏名被替换成其后的东西,这时候,“东西”还是字符串,但是在编译的时候,区别就显现出来了,就拿上例来说,如果是3.1415926,那么编译系统一定认为是数值,如果是 "3.1415926",那么编译系统一定认为是字符串,这都是语言本身的内在机制规定的,不这样,语言本身就会混乱不堪,自己就会崩溃,根本谈不上使用了。
区别就在编译阶段,这时候,语言本身的内在机制会严格鉴别字符和非字符,从而使程序顺利运行下去。
解释二:
宏定义 是 预编译 这个没有错吧
既然是预编译 那肯定还没有编译喽。
编译器是用来检测语法的。是以一定的规则来检测语法的。
宏定义在编译以前,当然没有 用编译的规则来衡量这些东西。
所以 宏定义(预编译)是字符串是很正常的事情。