【问题标题】:I am unfamiliar with this C++ notation [duplicate]我不熟悉这种 C++ 符号 [重复]
【发布时间】:2018-05-16 21:35:38
【问题描述】:

我正在尝试理解我的教授编写的代码。代码中有一行写着

a = (b > c) ? c : b;

其中 a、b 和 c 只是浮点变量。这是我第一次看到这种表情。我试图用谷歌搜索它,但没有任何结果。欢迎任何解释或对此解释的链接。谢谢。

【问题讨论】:

    标签: c++ expression


    【解决方案1】:

    这是一个三元表达式。三元表达式采用以下形式:

    condition ? <result_if_true> : <result_if_false>
    

    三元表达式可以翻译成if 语句:

    if (condition) {
        <result_if_true>;
    } else {
        <result_if_false>;
    }
    

    与等价的if 语句相比,三元表达式的一个优势是变量声明。例如下面的if 语句和三元表达式是等价的,但更简洁明了:

    int seconds = 4;
    
    // ===== USING IF STATEMENT =====
    string secs_string;
    
    if (seconds == 1) {
        secs_string = "second";
    } else {
        secs_string = "seconds";
    }
    
    cout << "You have " << seconds << " "<< secs_string << " remaining." << endl;
    // Output: You have 4 seconds remaining.
    
    
    // ===== USING TERNARY EXPRESSION =====
    string secs_string = (seconds == 1) ? "second" : "seconds";
    
    cout << "You have " << seconds << " "<< secs_string << " remaining." << endl;
    // Output: You have 4 seconds remaining.
    

    请注意,使用if 需要在if 语句之外单独声明字符串,而对于三元表达式,这可以内联完成。


    进一步阅读

    【讨论】:

    • 三元表达式不能真正转换为 if 语句,因为语句不能放在更大的表达式中。注意这里的“三元表达式是condition ? &lt;result_if_true&gt; : &lt;result_if_false&gt;.
    • @juanchopanza 好吧,总有一种方法可以将三元组脱糖为if 语句。我同意,这可能不是直接相关,但即使是复杂的东西,例如:x = a ? (b ? c : d) : (e ? f : g) 也可以减少为几个嵌套的if 语句。此外,foo(x ? y : z) 之类的内容可以脱糖为 if (x) foo(y); else foo(z);
    • 这里没有可以脱糖的糖。表达式和语句是非常不同的东西。您可以使用 if 语句将使用表达式的代码替换为等效的代码,但这并不意味着该表达式可以被该语句普遍替换。
    • 偶数赋值是 C++ 中的表达式(保证内置,可能会中断用户定义的类型),因此您可以使用 variable = whatever 作为子表达式。你不能用 ifs 做到这一点。
    • @juanchopanza,有没有一个三元表达式不能转换为if 语句的具体例子?我从来没有亲自遇到过(也许我编码的时间不够长)。我知道它们在概念上是不同的,但据我所知,它们基本上编译成同一个程序集。 (另外,我发现if 翻译是向不熟悉语法的人解释三元表达式的一种有效方式。这就是为什么我选择将它包含在我的答案中的部分原因。)
    【解决方案2】:

    这称为条件运算符,也称为三元运算符。它只是一个压缩形式的 if 语句。

    a = (b > c) ? c : b;
    

    效果和

    一样
    if (b > c) a = c; else a = b;
    

    【讨论】:

    • 值得注意的是,如果您试图引导编译器使用条件移动,有时使用三元运算符很有用。但是,就像所有优化提示和技巧一样,这并不能保证,甚至可能不再正确。
    • @Tyler 我不熟悉这种模式。也许您应该将其发布为答案。
    • 严格来说是不一样的
    • @Silvio:不是真正的模式,只是编译器可以在 x86 上转换 if 的两种不同方式:通过显式分支有条件地更改指向不同块的指令指针以处理条件或作为条件move (cmov) 不会更改 IP,而是将条件绑定到单个指令中。在低延迟情况下,尤其是那些需要统一延迟的情况下,cmov 是首选。
    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    相关资源
    最近更新 更多