【问题标题】:使用宏更改变量值和返回值 (c)
【发布时间】:2022-01-23 13:59:32
【问题描述】:

我正在尝试使用宏来更改变量的值,但也在过程中返回一个值。

本质上我想把下面的函数转换成宏

if (a%2){
    even = 1
} else {
  even = 0
}

return even

我正在努力同时做到这两点;编译器每次都向我返回错误(返回/更改值)。 有没有办法使用宏来做到这一点?太感谢了!注意 even 是一个已经声明的变量。

【问题讨论】:

  • 试试(even = (((a) % 2) == 0))。请显示宏尝试。
  • a 为奇数时,发布的伪代码尝试设置even = 1
  • 或一声巨响(even = !((a) % 2))

标签: c


【解决方案1】:

这样做

return (even = (a % 2) ? 1 : 0);

您应该在这些情况下使用ternary operator

【讨论】:

    【解决方案2】:

    问题中显示的代码对应的宏定义是:

    #define MyMacro(even, a) ((even) = (a)%2 ? 1 : 0)
    

    ? : 运算符,用作<i>E1</i> ? <i>E2</i> : <i>E3</i>,,根据第一个操作数 (<i>E1</i>) 的计算结果为真(非零)或假(零)。

    这个宏产生一个赋值表达式,even = <i>something</i>。这会根据您的要求“返回一个值”,因为赋值表达式本身可以用作一个值。它的值是分配的值。

    请注意,如果 a 是奇数,则此宏将 even 设置为 1。如果even 旨在描述a 的值,这与通常使用的1 与0 的含义形成对比。一般情况下,even 等变量设置为 1 表示偶数,设置为 0 表示非偶数。如果要在a 为偶数时将even 设置为1,可以使用:

    #define MyMacro(even, a) ((even) = (a)%2 ? 0 : 1)
    

    也可以这样写:

    #define MyMacro(even, a) ((even) = !((a)%2)
    

    因为! 运算符在其操作数为 0 时生成 1,否则为 0。

    【讨论】:

    • 为什么任何表达式 % 2 会产生除 0 或 1 以外的任何值?
    • @Lundin: -3 % 2 计算结果为 -1。
    • 对...我太习惯于无符号算术了。无论如何,另一种选择是((a)%2==0)。我认为它不会影响机器代码中的分支数量。
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2012-05-04
    • 2016-03-20
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多