三元运算符在递归中的奇怪行为

And*_*And 1 c++ recursion

有一个正常工作的代码:

#include <iostream>

int sum_odd_digits(int n)
{
  if(n==0) return 0;
  else return (((n%2)!=0)?n%10:0) + sum_odd_digits(n/10);
}

int main(int argc, char ** argv)
{
  std::cout<<sum_odd_digits(25897641)<<std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果要去掉外括号,即替换

else return (((n%2)!=0)?n%10:0) + sum_odd_digits(n/10);
Run Code Online (Sandbox Code Playgroud)

else return ((n%2)!=0)?n%10:0 + sum_odd_digits(n/10);
Run Code Online (Sandbox Code Playgroud)

程序开始给出错误的输出结果,即开始不正确地工作。

为什么?这两条线有什么区别?

cig*_*ien 7

这是由于运算符优先级: 的+优先级高于?:,因此您的错误版本解析为:

((n%2)!=0) ? n%10 : (0 + sum_odd_digits(n/10));
                    ^                        ^
                  // addition is grouped first
Run Code Online (Sandbox Code Playgroud)

现在与第一个版本有明显不同的分组。

  • @And - 编译器将正确地解析带或不带括号的代码。如果没有外括号的代码没有表达您的意思,则需要外括号。 (3认同)