【问题标题】:Occurrences of question mark in C codeC代码中出现问号
【发布时间】:2011-07-16 13:05:51
【问题描述】:

我正在做一个简单的程序,它应该计算三元运算符 ?: 在 C 源代码中的出现次数。我正在尽可能地简化它。所以我从源代码中过滤了这些东西:

  1. 字符串文字“”
  2. 字符常量''
  3. 三字母序列 ??=、??( 等
  4. 评论

现在我只计算问号的出现次数。

所以我的问题是:是否有任何其他符号、运算符或其他任何可能导致问题的东西 - 包含“?” ?

假设源是语法有效的。

【问题讨论】:

    标签: c syntax ternary-operator


    【解决方案1】:

    在 K&R ANSI C 中,唯一可以有效出现问号的地方是:

    1. 字符串文字“”
    2. 字符常量''
    3. 评论

    现在您可能会注意到此列表中缺少宏和三元组序列。

    我没有包含三元字符序列,因为它们是编译器扩展而不是“有效的 C”。我并不是说你应该从你的程序中删除检查,我想说你已经比 ANSI C 需要的更进一步。

    我也没有包括宏,因为当您谈论可能出现在宏中的字符时,您可能意味着两件事:

    1. 宏名称/标识符
    2. 宏实体

    那个?字符不能出现在宏标识符中(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 文件呢?

    【讨论】:

    • 三字母序列是有效的 C。参见 the standard 中的 5.2.1.1
    • -1 整个帖子都不正确。这就是为什么你应该参考 ISO C 而不是一些 K&R mumbo ANSI jumbo。 Trigraphs 是完全有效的标准 C。在 C 标准第 5.2.1.1 章或 K&R 2nd 版中阅读所有关于它们的信息。另外供您参考,K&R 第 1 版和第 2 版对 // cmets 一无所知。它们不是有效的 K&R mumbo ANSI jumbo C。
    • 对不起。我是 C 新手,我刚刚完成了 K&R 1st 版本。认为所有这些信息(尽管仍然是一本好书)仍然相关,这对我来说是愚蠢的。
    • 如果您像您声称的那样对 C 语言不熟悉,您不应该三思而后行吗?
    【解决方案2】:

    在预处理的源代码上运行您的工具(您可以通过运行例如gcc -E 来获得它)。这将完成所有宏扩展(以及 #include 替换),并消除所有三元组和 cmets,因此您的工作将变得更加容易。

    【讨论】:

    • +1 使用良好的现有软件来消除问题
    • 确定+1。尽管 OP 已经接受了我写的内容,但这可能是他或其他人在类似情况下所需要的。这一切都归结为他/她想数什么。
    • 不允许调用 gcc 和其他,并且不保证可用性。分析器是 Perl 脚本...
    【解决方案3】:

    我认为您找到了所有引入问号的地方,因此消除了所有可能的误报(对于三元运算)。但也许你消除了太多:也许你想计算那些由宏引入的“?:”;你不算那些。那是你的意图吗?如果是这样,你就完成了。

    【讨论】:

    • +1,我的帖子几乎是相同的答案。预处理代码将是一个简单的选择,在每个出现的宏定义中计算一次 ?: 恕我直言是公平的选择。
    • 是的,取决于 OP 想要什么 :-)
    • 删除宏是一项要求,所以这种行为是正确的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多