【问题标题】:Cannot understand comma expression无法理解逗号表达式
【发布时间】:2012-06-14 00:26:16
【问题描述】:
#include <iostream>
using namespace std;
int main()
{
    int a, b, c, max;
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"c="; cin>>c;
    a>b?(max=a, a=b, b=max):a;
    b>c?(max=b, b=c, c=max):a;
    a>b?(max=a, a=b, b=max):a;
    cout<<a<<"  "<<b<<"  "<<c;
}

这是一个代码,您可以在其中输入 3 个随机数,然后将它们按顺序排列。但是,我不明白这部分:

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

它是如何工作的,为什么?

假设a = 6b = 54c = 12

  1. a>b?(max=a, a=b, b=max):a;

  2. b>c?(max=b, b=c, c=max):a;

  3. a>b?(max=a, a=b, b=max):a;

程序本身可以正常工作。我只是不明白算法是如何工作的。

【问题讨论】:

  • 这是怪诞的代码。最好忽略它。
  • "a&gt;b?(max=a, a=b, b=max):a; " 不,它根本没有做任何事情,因为 b > a..."然后是 54 =max”什么?如何为文字赋值?
  • 中心思想是a&gt;b?(max=a, a=b, b=max):a; 如果a&lt;=b 什么都不做
  • 嗯,它来自高中手册(甚至不是过时的)O.o 谢谢大家的回答!

标签: c++ numbers operator-keyword comma


【解决方案1】:

这个:

cond ? A : B

大致等价于:

if (cond) {
    A;
} else {
    B;
}

这个:

(X, Y, Z)

大致等价于:

X;
Y;
Z;

即依次完整地评估每个表达式。

使用这两个规则,您应该能够跟踪代码的执行。然而,该代码是怪诞的,不应该这样写。所以我的建议是忽略它,并正确编写算法。

【讨论】:

  • 这并没有告诉他它在做什么,它重复了 cplusplus.com 上的内容
  • @trumpetlicks:从问题中可以看出,OP 不熟悉这些运算符的工作原理,这使他无法弄清楚代码是如何工作的。我的回答解释了这些运算符的工作原理。
【解决方案2】:

所有代码所做的都是滥用逗号运算符在一个语句中执行多项操作以交换值的能力。

第一行查找前两个数字的最大值。第二个找到那个和第三个的最大值,所以它现在找到了三个中的最大值。第三行将另外两行依次排序。

和这个差不多:

if (a > b)
    swap (a, b); //b is max(a,b)
if (b > c)
    swap (b, c); //c is max(max(a,b),c), which is largest
if (a > b)
    swap (a, b); //b is max (a, b), so numbers are in order smallest to largest

【讨论】:

    【解决方案3】:
    a>b?(max=a, a=b, b=max):a
    

    最后的 ":a" 真的没有任何作用,它可以很容易地成为 ":0"。如果“a>b”为假,则本质上是要执行的语句。但由于 a 没有分配给任何东西,它没有做任何事情。所以在这种情况下

    if(a > b){
        max = a;
        a = b;
        b = max;
    }
    

    它使用max变量来交换a和b; SAME 算法用于以下两行。所以本质上

    if a > b then swap them
    now if b (which could hold a) > c then swap them
    now if a (which could hold the older b) > b(which could hold the oldest c) then swap
    

    【讨论】:

      【解决方案4】:

      嗯,基本上我就是这样。

      a>b?(max=a, a=b, b=max):a;
      

      第一部分只是第三个 if 语句形式的普通比较,所以基本上它检查 a&gt;b,然后 ? 正好等于第一个括号集,所以如果它是真的,它评估第一部分,否则: 之后的代码就像 else 一样,即被评估。(max=a, a=b, b=max) 基本上依次评估每个项目,所以首先将max 设置为a,然后设置a = b,最后b = max;其他两行也一样。

      您可以在此处阅读更多内容:http://www.cplusplus.com/doc/tutorial/operators/

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        相关资源
        最近更新 更多