【问题标题】:Simulating conditionals模拟条件
【发布时间】:2023-03-09 00:47:01
【问题描述】:

我们如何在不使用if?(三元运算符)的情况下编写条件行为?

想到一个想法:

for(;boolean_expression;) {
  // our code
  break;
}

还有其他人吗?

【问题讨论】:

  • 你为什么要这样做?
  • @da code monkey - 答:好奇心

标签: c conditional conditional-statements


【解决方案1】:

我希望你不想要的只是“如果”或“三元”。

#1

这个怎么样:

而不是:if (condition) printf("Hi");

用途:

condition && printf("Hi");

短路评估。这与使用if 非常相似。

#2

对于if (condition) a(); else b();

用途:

int (*p[2])(void) = {b, a};
(p[!!condition])()

使用函数指针数组和双重否定。

#3

另一个接近三元运算符的变体(虽然是函数)

ternary_fn(int cond, int trueVal, int falseVal){
    int arr[2];
    arr[!!cond] = falseVal;
    arr[!cond] = trueVal;
    return arr[0];
}

ret = ternary_fn(a>b, 5, 3) 一样使用它而不是ret = a > b ? 5 : 3;

【讨论】:

  • 它确保该值始终为 0 或 1,否则您可以将任何正值作为 true 传入。
【解决方案2】:
switch(condition){
  case TRUE:
    ourcode(); 
    break;
  default:
    somethingelse();
 }

【讨论】:

    【解决方案3】:

    使用函数指针:

    void ourcode(void){puts("Yes!");}
    void somethingelse(void){puts("No!");}
    
    void (*_if[])(void) = { somethingelse,ourcode };
    
    int main(void){
      _if[1==1]();
      _if[1==0]();
      return 0;
    }
    

    这依赖于评估为 1 的真正布尔表达式,这对于 gcc 来说恰好是正确的,但我认为标准不能保证它。

    【讨论】:

    • 标准保证逻辑运算符(==!=!><>=<=、@ 987654329@ 和 ||) 为 0 或 1。
    • 你可以给一个更好的名字来代替_if
    • @caf:这是真的。但是, if() 和 ?: 都在给定任何非零表达式的情况下评估“真实”路径,这一点值得牢记。明智地使用 !!在这里会有所帮助。
    • @Regularfry:我不打算将您的方法与我的方法进行比较。我想强调的是使用带有前导下划线的标识符。我记不太清楚了,但是这些名称是为将来在全局命名空间中的实现而保留的。谷歌搜索标准的相关部分。 :-)
    • 你是对的,带有文件或全局范围的前导下划线的标识符被保留。我应该把它命名为 if_ :-)
    猜你喜欢
    • 2019-03-21
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多