本节讲述ANSIC与MPLAB C30所能接受的C语言之间的语句差别。语句差别是基本GCC实现的一部分,GCC文档,本节讨论的内容是基于标准GCC文档,并选择了GCC中针对MPLAB C30的特定语法和语义来进行讲述。
1.将标号作为值
可以用单目运算符“&&”获得在当前函数(或包含函数)中定义的标号的地址。值的类型为void*。这个值为常量,并可在这种类型的常量有效的任何地方使用这个值。例如:
为使用这些值,需要能跳转到值。这可通过计算goto语句goto*exp;来实现。例如:
可使用void*类型的任何表达式。
然后就可以通过索引来这样选择标号:
这种标号值数组的用途与switch语句很类似。switch语句更整齐,比数组更好。标号值的另外一个用途是可以用在线程代码的解释程序中。解释程序函数中的标号可存储在线程代码中用于快速调度。
这种机制可能被错误使用,而跳转到其他函数的代码中。编译器不能阻止这种现象的发生,因此必须小心,确保目标地址对于当前函数有效。
2.省略操作数的条件表达式(www.xing528.com)
条件表达式的中间操作数可以被省略。如果第一个操作数非零,它的值就是条件表达式的值。因此,对于以下表达式:
如果x的值非零,表达式的值就是x的值,否则就是y的值。这个例子完全等价于下面的表达式:
在这个简单的例子中,省略中间操作数并不是特别有用。当能存在(如果它是一个宏参数)副作用时,省略中间操作数就变得特别有用。那么重复中间操作数将产生副作用两次。省略中间操作数使用了已经计算过的值,而不会因为重新计算而产生不希望的影响。
3.case范围
可以在单个case标号中指定一个连续值的范围,例如:
这与各个case标号的适当数字有相同的作用,每个数字对应从low到high中的每个整数值。这一功能对于ASCII字符码范围特别有用,例如:
注意,在…两边要加空格,否则它和整数一起使用时可能出现解析错误。例如要这样写:
而不要写成
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。