功能宏问题

har*_*ari 4 c function c-preprocessor

编程实践书说:

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

#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
Run Code Online (Sandbox Code Playgroud)

请注意,参数c在宏的主体中出现两次.如果我在这样的上下文中调用supper,

while (isupper(c = getchar()))
Run Code Online (Sandbox Code Playgroud)

然后,每当输入字符大于或等于A时,它将被丢弃并且另一个字符读取以针对Z进行测试.

我不明白如何可以丢弃更大的> = A的字符.

Fre*_*Foo 6

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

isupper(c = getchar())
Run Code Online (Sandbox Code Playgroud)

会扩大到

((c = getchar()) >= 'A' && (c = getchar()) <= 'Z')
Run Code Online (Sandbox Code Playgroud)

通过短路规则&&调用getchar两次,如果它返回>= 'A'第一次并分配c第二次调用返回的值.

  • "iff"=="当且仅当".(经常用于数学) (2认同)