【问题标题】:Issue with function macro函数宏的问题
【发布时间】:2011-10-31 23:10:42
【问题描述】:

编程实践这本书说:

函数宏最严重的问题之一是一个参数 在定义中出现多次可能会被多次评估;如果 调用中的参数包含具有副作用的表达式,结果是一个微妙的错误。 此代码尝试执行以下字符测试之一:

#define isupper(c) ((c) >= 'A' && (c) <= 'Z')

请注意,参数 c 在宏的主体中出现了两次。如果我叫我吃晚饭 在这样的背景下,

while (isupper(c = getchar()))

那么每次输入字符大于等于A时, 丢弃并读取另一个字符以针对 Z 进行测试。

我不明白如何丢弃大于 >= A 的字符。

【问题讨论】:

  • 注意问题可以通过#define isupper(c) ((unsigned)(c)-'A'&lt;='Z'-'A')修复

标签: c function c-preprocessor


【解决方案1】:

由于宏定义在实际编译之前以文本形式扩展到程序中,

isupper(c = getchar())

将扩展为

((c = getchar()) >= 'A' && (c = getchar()) <= 'Z')

根据&amp;&amp; 的短路规则,它调用getchar 两次,如果它第一次返回&gt;= 'A' 并将第二次调用返回的值分配给c

【讨论】:

  • "iff" == "当且仅当"。 (常用于数学)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多