Vai*_*orn 5 c minimum c-preprocessor
我想用#define创建一个简单的宏来返回两个数字中较小的一个.
我怎么能用C做这个?提出一些想法,看看你是否可以使它更加混淆.
GMa*_*ckG 12
典型:
#define min(a, b) (((a) < (b)) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)
但是你为什么要混淆呢?
这个结果将结果存储在变量中,并且只评估每个参数一次.它基本上是一个穷人的内联函数+声明:
#define min(t, x, a, b) \
t x; \
{ \
t _this_is_a_unique_name_dont_use_it_plz_0_ = a; \
t _this_is_a_unique_name_dont_use_it_plz_1_ = b; \
x = _this_is_a_unique_name_dont_use_it_plz_0_ < \
_this_is_a_unique_name_dont_use_it_plz_1_ ? \
_this_is_a_unique_name_dont_use_it_plz_0_ : \
_this_is_a_unique_name_dont_use_it_plz_1_ ; \
}
Run Code Online (Sandbox Code Playgroud)
使用它像:
min(int, x, 3, 4)
/* x is an int, equal to 3
Just like doing:
int x = min(3, 4);
Without double evaluation.
*/
Run Code Online (Sandbox Code Playgroud)
而且,仅仅为了它的地狱,一个GNU C的例子:
#define MAX(a,b) ({ \
typeof(a) _a_temp_; \
typeof(b) _b_temp_; \
_a_temp_ = (a); \
_b_temp_ = (b); \
_a_temp_ = _a_temp_ < _b_temp_ ? _b_temp_ : _a_temp_; \
})
Run Code Online (Sandbox Code Playgroud)
它没有被混淆,但我认为这适用于任何类型,在任何情况下,(几乎,见评论)任何参数等; 如果你能想到任何反例,请更正.
abe*_*nky -6
对于稍微混乱的情况,请尝试以下操作:
#define MIN(a,b) ((((a)-(b))&0x80000000) >> 31)? (a) : (b)
Run Code Online (Sandbox Code Playgroud)
基本上,它将它们相减,并将符号位视为 1 或 0。如果减法结果为负数,则第一个参数较小。
| 归档时间: |
|
| 查看次数: |
34972 次 |
| 最近记录: |