【问题标题】:Why doesn't the inside of the if statement work completely? [duplicate]为什么 if 语句的内部不能完全工作? [复制]
【发布时间】:2021-07-31 21:10:24
【问题描述】:
#include <stdio.h>

int i=0, n=10;

int f(int n, int *i){
   if (n==0){
      return *i;
   }
   else{
      (*i)++;
      return n+f(n/2, i);
   }
}

int main(){
   if (f(n, &i) || f(n*n, &i) || f(n*n*n, &i)){
      n = f(n, &i);
   }
   printf("%d %d", n, i);
}

当我第一次看到该代码时,我认为所有条件都可以。但是当我运行该代码时,if 内部并没有完全工作。只有f(n, &amp;i)f(n, &amp;i) || f(n*n, &amp;i) || f(n*n*n, &amp;i) 中工作,编译器继续使用n = f(n, &amp;i);。这段代码输出:

26 8

为什么编译器不运行f(n*n, &amp;i) || f(n*n*n, &amp;i)?即使第一个条件为真,它不应该运行其他条件吗?

【问题讨论】:

  • “即使第一个条件为真,也不应该运行其他条件吗?”不,这是C/C++的基本规则之一。
  • 如果第一个表达式为真,那么所有其他表达式都无法使其更真,因此自 1978 年以来的 C/C++ 编译器将它们缩短了。
  • 这并没有解决问题,但是那些全局变量in 真的很混乱,因为函数f 有同名的局部变量。全局变量没有做任何有用的事情;将它们移至main

标签: c++ c algorithm


【解决方案1】:

逻辑或运算符|| 具有所谓的短路评估。这意味着如果左操作数的计算结果为真(即非零),那么它就知道整个表达式为真并且不计算右操作数。

这允许你做这样的事情:

if ((pointer == NULL) || (pointer->field == 0)) {

在这种情况下,如果 pointer 为 NULL,那么您不希望评估 || 的右侧,否则您将取消引用 NULL 指针。

所以因为f(n, &amp;i) 的计算结果为非零值,所以f(n*n, &amp;i)f(n*n*n, &amp;i) 都不会被计算。

【讨论】:

    【解决方案2】:

    它不需要在 OR 语句中运行其他条件。 如果第一个是真的,那么它可以运行代码。

    也许您的意思是 AND 语句?

    【讨论】:

    • “它不需要运行”意味着“它可以运行”。但是这是错误的。事实上,“它一定不能运行”。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多