【发布时间】:2011-07-16 13:05:51
【问题描述】:
我正在做一个简单的程序,它应该计算三元运算符 ?: 在 C 源代码中的出现次数。我正在尽可能地简化它。所以我从源代码中过滤了这些东西:
- 字符串文字“”
- 字符常量''
- 三字母序列 ??=、??( 等
- 评论
- 宏
现在我只计算问号的出现次数。
所以我的问题是:是否有任何其他符号、运算符或其他任何可能导致问题的东西 - 包含“?” ?
假设源是语法有效的。
【问题讨论】:
标签: c syntax ternary-operator
我正在做一个简单的程序,它应该计算三元运算符 ?: 在 C 源代码中的出现次数。我正在尽可能地简化它。所以我从源代码中过滤了这些东西:
现在我只计算问号的出现次数。
所以我的问题是:是否有任何其他符号、运算符或其他任何可能导致问题的东西 - 包含“?” ?
假设源是语法有效的。
【问题讨论】:
标签: c syntax ternary-operator
在 K&R ANSI C 中,唯一可以有效出现问号的地方是:
现在您可能会注意到此列表中缺少宏和三元组序列。
我没有包含三元字符序列,因为它们是编译器扩展而不是“有效的 C”。我并不是说你应该从你的程序中删除检查,我想说你已经比 ANSI C 需要的更进一步。
我也没有包括宏,因为当您谈论可能出现在宏中的字符时,您可能意味着两件事:
那个?字符不能出现在宏标识符中(http://stackoverflow.com/questions/369495/what-are-the-valid-characters-for-macro-names),我将宏体视为常规 C 代码,所以第一个列表(字符串文字、字符常量和 cmets*)也应该涵盖它们。
* 宏可以有效地包含 cmets 吗?因为如果我使用这个:
#define somemacro 15 // this is a comment
那么// this is a comment 不是宏的一部分。但是如果我用-D somemacro="15 // this is a comment" 编译这个C 文件呢?
【讨论】:
在预处理的源代码上运行您的工具(您可以通过运行例如gcc -E 来获得它)。这将完成所有宏扩展(以及 #include 替换),并消除所有三元组和 cmets,因此您的工作将变得更加容易。
【讨论】:
我认为您找到了所有引入问号的地方,因此消除了所有可能的误报(对于三元运算)。但也许你消除了太多:也许你想计算那些由宏引入的“?:”;你不算那些。那是你的意图吗?如果是这样,你就完成了。
【讨论】:
?: 恕我直言是公平的选择。