C 这个MIN宏是如何工作的?

C 这个MIN宏是如何工作的?,c,macros,C,Macros,如果这是个愚蠢的问题,请原谅。我似乎无法理解以下MIN宏是如何工作的: 定义最小值(x,y)(y)^((x^y)和-(x

如果这是个愚蠢的问题,请原谅。我似乎无法理解以下MIN宏是如何工作的:

定义最小值(x,y)(y)^((x^y)和-(x宏是一个预处理器指令,意味着无论在何处使用,它都将被相关的代码段替换

如果您在
MIN
宏中进行编辑,我或这里的其他人应该能够帮助解释它

例如:

#包括
#定义加号+
int main(){
printf(“%d”,(1加3));
}
这应该只输出
4

编辑 让我们分析一下你的宏

我们有

(y) ^ ((x ^ y) & -(x < y))
(y)^((x^y)和-(x
  • 让我们看最后一部分,
    (x
    。如果
    x
    小于
    y
    1
    else,则为
    1
    。因此,
    -(x
    将是
    0xffffffff
    ,如果
    x
    更小,而
    0
    则是

  • 所以现在,
    ((x^y)&-(x
    变成
    ((x^y)&0xffffffffff)
    ,也就是说,如果x小于y,那么
    ((x^y)&0)
    ,即
    0

  • 因此,如果x较小而
    (y)^0
    ,则整个宏变为
    (y)^(x^y)
    ,即
    x
    ,否则。这确实是所需的
    MIN
    功能


宏是一个预处理器指令,意味着无论在何处使用,它都将被相关的代码段替换

如果您在
MIN
宏中进行编辑,我或这里的其他人应该能够帮助解释它

例如:

#包括
#定义加号+
int main(){
printf(“%d”,(1加3));
}
这应该只输出
4

编辑 让我们分析一下你的宏

我们有

(y) ^ ((x ^ y) & -(x < y))
(y)^((x^y)和-(x
  • 让我们看最后一部分,
    (x
    。如果
    x
    小于
    y
    1
    else,则为
    1
    。因此,
    -(x
    将是
    0xffffffff
    ,如果
    x
    更小,而
    0
    则是

  • 所以现在,
    ((x^y)&-(x
    变成
    ((x^y)&0xffffffffff)
    ,也就是说,如果x小于y,那么
    ((x^y)&0)
    ,即
    0

  • 因此,如果x较小而
    (y)^0
    ,则整个宏变为
    (y)^(x^y)
    ,即
    x
    ,否则。这确实是所需的
    MIN
    功能


请注意,如果
x
,则
-(x
的结果将仅为0。因此,它相当于:

y ^ 0
这是
y


  • 请注意,如果
    x
    ,则
    -(x
    的结果将仅为0。因此,它相当于:

    y ^ 0
    
    这是
    y


    • 如果x小于y,则:

      • (x
        是1
      • -(x
        为-1
      • ((x^y)和-(x
        ((x^y)和-1)
        ,这是
        (x^y)
        ,因为
        (anything&-1)==anything
        ,因为-1都是“1”位
      • y^(x^y)
        x
        ,因为XOR是可交换的,而y的值被抵消
      如果y小于或等于x,则:

      • (x
        为0
      • -(x
        为0
      • ((x^y)和-(x
        ((x^y)和0)
        ,这是
        0
        ,因为
        (任何东西&0)==0
        ,因为0都是“0”位
      • y^0
        y
      不过,宏目前有一个严重的错误:它需要在外部表达式周围加括号,否则在其他表达式中使用时会遇到运算符优先级混乱的问题。例如,
      MIN(2,3)*4
      当前扩展为
      (3)^((2^3)和-(2<3))*4
      ,计算结果为7,而不是正确的8,因为乘法在最后的XOR之前完成。出于同样的原因,最好在每个参数替换前后加上括号:

      #define MIN(x, y) ((y) ^ (((x) ^ (y)) & -((x) < (y))))
      
      #定义最小值(x,y)((y)^((x)^(y))和-((x)<(y)))
      
      只有当平台使用整数时,宏仍然有效,并且它可能不会比MIN的明显定义快,即:

      #define MIN(x, y) ((x) < (y) ? (x) : (y))
      
      定义最小值(x,y)((x)<(y)?(x):(y))
      如果x小于y,则:

      • (x
        是1
      • -(x
        为-1
      • ((x^y)和-(x
        ((x^y)和-1)
        ,这是
        (x^y)
        ,因为
        (anything&-1)==anything
        ,因为-1都是“1”位
      • y^(x^y)
        x
        ,因为XOR是可交换的,而y的值被抵消
      如果y小于或等于x,则:

      • (x
        为0
      • -(x
        为0
      • ((x^y)和-(x
        ((x^y)和0)
        ,这是
        0
        ,因为
        (任何东西&0)==0
        ,因为0都是“0”位
      • y^0
        y
      不过,宏目前有一个严重的错误:它需要在外部表达式周围加括号,否则在其他表达式中使用时会遇到运算符优先级混乱的问题。例如,
      MIN(2,3)*4
      当前扩展为
      (3)^((2^3)和-(2<3))*4
      ,计算结果为7,而不是正确的8,因为乘法在最后的XOR之前完成。出于同样的原因,最好在每个参数替换前后加上括号:

      #define MIN(x, y) ((y) ^ (((x) ^ (y)) & -((x) < (y))))
      
      #定义最小值(x,y)((y)^((x)^(y))和-((x)<(y)))
      
      只有当平台使用整数时,宏仍然有效,并且它可能不会比MIN的明显定义快,即:

      #define MIN(x, y) ((x) < (y) ? (x) : (y))
      
      定义最小值(x,y)((x)<