【问题标题】:printf precedence with || && in it [closed]printf 优先于 || &&在其中[关闭]
【发布时间】:2016-05-06 03:00:02
【问题描述】:

正如我们所说,我目前正在为决赛做准备。我无法弄清楚这个问题的答案以及为什么会是那个答案。有人可以向我解释答案以及它是如何导致的吗?这是从一个旧的考试。提前谢谢!

int main(){
   int i = 1, j=1, k=1;
   printf("%d", ++i || ++j && ++k);
   printf("%d %d %d \n", i, j, k);
   return 0;
}

【问题讨论】:

  • 您对逻辑运算符和增量运算符的优先级有何理解,您的依据是什么? 提示:查看 C 标准文档以获取权威信息。
  • printf 跟它有什么关系?与往常一样适用相同的优先级规则——首先是递增,然后是逻辑 AND,最后是逻辑 OR。
  • 为了准备考试,你可以试试它会打印什么。这样,你会学到更多。 ;)
  • 基本上,这是询问将评估三部分表达式的多少组件的一种迂回方式。一旦你知道了这个问题的答案,你就会知道打印了什么。
  • @Cole 您对求值顺序运算符优先级感到困惑。

标签: c


【解决方案1】:

程序是一个很简单的例子来理解优先级,如果不知道运算符优先级看here。根据我的理解,这是我的想法,让我们一步一步来(按照从左到右的关联):

  1. ++ 战胜一切,i 递增:

    int main(){
       int i = 1, j=1, k=1;
       printf("%d\n", ++i );
       printf("%d %d %d \n", i, j, k);
       return 0;
    }
    

输出:

2
2 1 1 
  1. 这里是逻辑运算符,现在你需要知道在某些表达式的情况下,例如 (expr1 || expr2),expr2 在 expr1 为零或假时执行,这里 i=2 因此它不会。另外,执行后首先 printf 打印 true(1) 或 false(0) ( expr1 || expr2)

    int main(){
       int i = 1, j=1, k=1;
       printf("%d\n", ++i || ++j);
       printf("%d %d %d \n", i, j, k);
       return 0;
    }
    

输出:

1
2 1 1
  1. 最后,如果 ( expr1 && expr2 ) expr2 仅在 expr1 为真或 1 时执行,在这种情况下 expr1 不为真,因此 ++k 不会增加。第一个 printf 也遵循上述相同的规则。

    int main(){
       int i = 1, j=1, k=1;
       printf("%d\n", ++i || ++j && ++k);
       printf("%d %d %d \n", i, j, k);
       return 0;
    }
    

输出:

1
2 1 1

请参阅以下参考资料:

Order of execution for an if with multiple conditionals

Order of logical OR execution in C

【讨论】:

  • @psuedoAJ 非常感谢您的回答!现在更有意义了!非常感谢!
  • 没问题。祝总决赛好运。请为未来的访客投票。
  • 显然我的声望还不够!对不起!
  • 在情况 3 中,您没有在代码中使用 &&
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多