【问题标题】:C++ What If The Conditional Operator Were Left Associative [closed]C ++如果条件运算符是左关联的怎么办[关闭]
【发布时间】:2013-07-19 10:01:38
【问题描述】:

这是一个我发现我真的不知道答案的问题。假设我们有以下代码:

int grade = 100;
string finalgrade = (grade > 90) ? "High Pass"
                                 : (grade > 75) ? "Pass"
                                                : (grade >= 60) ? "low pass" : "fail";

如果条件运算符保持关联,将如何评估它?

【问题讨论】:

  • 基本上,您将拥有 PHP。哈哈哈,我真希望我是在开玩笑。见phpsadness.com/sad/30
  • 如果语言规则发生变化,询问会发生什么是没有意义的。改变它的人会写下新法律中发生的事情,我们会阅读、学习和应用它。然而,我们将继续做的一件事是避免像您发布的那样复杂的表达方式。
  • @DanielDaranas 问会发生什么是有道理的。想象一下,如果 PHP 语言作者思考一下会产生什么影响。
  • 只是一点点,但是...?...:...?...:... 的序列正好对应if ... else if ... else if .... 的情况,并且应该以相同的方式格式化,没有第二个,第三个等的额外缩进。在这种情况下,我会在每个 ? 之前添加一个新行,并且缩进都一样,但其他解决方案也是可行的,只要它们在每次添加 ? 时不继续缩进即可。
  • @DanielDaranas 可以说是对的,但有时它可以帮助理解为什么当前的规则是“这样”而不是“那样”,并且有一种基本原理可以帮助记住规则! :)

标签: c++ conditional-operator


【解决方案1】:

如果?: 是左关联的,则意味着:

a ? b : c ? d : e

相当于:

(a ? b : c) ? d : e

代替:

a ? b : (c ? d : e)

将此应用于您的示例,您会得到:

string finalgrade =   (  (  (grade > 90)
                          ? "High Pass"
                          : (grade > 75))
                       ? "Pass"
                       : (grade >= 60))
                    ? "low pass"
                    : "fail";

其中——假设编译器没有抱怨不匹配的类型——grade = 100 将导致:

string finalgrade =   (  (  true
                          ? "High Pass"
                          : (grade > 75))
                       ? "Pass"
                       : (grade >= 60))
                    ? "low pass"
                    : "fail";

string finalgrade =   (  "High Pass"
                       ? "Pass"
                       : (grade >= 60))
                    ? "low pass"
                    : "fail";

string finalgrade =   "Pass"
                    ? "low pass"
                    : "fail";

string finalgrade = "low pass";

【讨论】:

  • 结果会比这更有趣,因为编译器会尝试统一:两边的类型。一侧有一个bool,另一侧有一个char const*char const* 可以转换为 bool,但不能反过来,因此您最终会尝试使用 bool 初始化 finalgrade(不会编译)。
  • 并且非常清楚:grade > 90 not 评估为1,它评估为true
  • @JamesKanze 我确实注意到这是假设编译器不会抱怨不匹配的类型(它会抱怨,但无论如何这是一个假设的练习)。但是,我看不出它会如何尝试使用 bool 值初始化 finalgrade,因为本练习中仅有的两个可能结果是 "low pass""fail"
  • @JamesKanze 哎呀,我忘了这是一个 C++ 问题,而不是 C。我已经更正了 true 位。
  • 给定a ? b : c,编译器将尝试为bc 找到一个公共类型。在 C 中,它显然会失败,因为> 的结果是int,字符串文字衰减为char*,并且这两种类型之间没有隐式转换。在 C++ 中,> 的结果是bool指向bool 的指针的隐式转换(但不是相反)。然而,在进一步阅读该标准时,并不是所有的隐式转换都被考虑在内。特别是不会使用指针到bool的转换,所以结果也是非法的。
【解决方案2】:

在您的示例中: finalgrade = "高通"

计算是从右到左进行的

【讨论】:

  • "条件运算符如果是关联,将如何评估?"
  • 对,对不起,我看错了 :) 我的回答没用(但准确)
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 2015-02-15
  • 2013-04-13
  • 1970-01-01
  • 2012-12-23
  • 2012-05-22
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多