2014-03-29 30 views
-4

代码1这两个程序哪个更好,为什么?

int A, B, MAX; 
cout << "Give two numbers:" << endl; 
cin >> A >> B; 

if (A > B) 
{ 
    MAX = A; 
} 
else 
{ 
    MAX = B; 
} 
cout << "Largest amongst given numbers is: "; 
cout << MAX << endl; 
return 0; 

代码2

int A, B, MAX; 
cout << "Give two numbers:" << endl; 
cin >> A >> B; 

MAX = A; 
if (B > MAX) 
{ 
    MAX = B; 
} 
cout << "Largest amongst given numbers is: "; 
cout << MAX << endl; 
return 0; 

在上述程序逻辑,其中的一个是最好的,为什么?他们之间有什么区别?这是我的考试问题,我想问问堆栈溢出知道最好的意见。

+5

为什么不'MAX =标准:: MAX(A,B);'? – user2357112

+1

什么是你最好的定义? – user1118321

+0

这两个程序哪个更好,为什么? – user3474853

回答

0

我会说使用代码2.最好是因为你明确地说如果MAX B大于MAX A,那么将MAX改为B.另一个是,你没有任何关于为什么MAX的定义因素A比MAX B.更大的从我所看到的,你会使用代码1比代码2

+3

我不同意;第一个看起来很清楚。如果A大于B,则A是最大值。否则,B是最大值。除了调用'std :: max'的答案外,这整个问题似乎基本上都是基于意见的。 – computerfreaker

+0

是的,我同意。 – MurphyTheTurtle

5
MAX = std::max(A, B); 

比无论是在清晰度方面更可能有一个更难的时间。

就速度而言,编译器应该能够优化这些方法中的任何一种方法;但我又喜欢std::max,因为我会更快地相信编译器优化标准函数而不是某些任意编写的代码来执行相同的任务。

1

它们是相同的,所以我更喜欢代码1,因为它更具可读性。在这两种情况下,您必须将A和B都带入一个寄存器(不管),然后进行单个比较(不管)。它不会写出变量MAX,直到完成该段(因为它不需要将任何东西踢出寄存器)。

这不会导致任何性能增益。实际上,编译器可能会编译它们(编译器会进行各种代码修改以创建最佳指令集),这是可能的(尽管我怀疑它)。

建议唯一可能会提高性能的方法是使用库函数std::max。这是因为编译器将基本上以最有效的方式执行比较(可能甚至没有调用条件跳转)。如果你的两个值是整数,那么你可以看到here可以找到带有5个整数运算的最大值(除了乘法一般可以在一个周期内完成外)。您通常希望尽可能避免有条件的跳转,并且此算法可以实现这一点。最有可能的最大函数做这样或类似的东西(但它将不得不不同的浮点值)。

1

MAX = std::max(A,B)后,下一个最好的代码是:

MAX = A > B ? A : B; 

如果你不想使用的话,我更喜欢你的 “代码1”,因为:

  • 码2总是设置MAX = A,这是暂时的误导,只有随着后面的代码被研究才变得清晰;虽然这个问题在C++和许多其他语言中很常见,但是当它很容易避免时,没有特别的理由去容忍这种并发症。对于某些类型(该问题最初并未指定int),分配可能是一个昂贵的操作(例如复制大量的数据),所以总是分配一次比潜在分配两次

对于这两种原因的那些更好,它也可取声明和在一个步骤中定义MAX。你不会需要一个误导性的和潜在的低效或不可用默认:如果说这是一个非const参考接受作为函数参数,但是当它是可能它的另一个很好的理由,更喜欢std::max或三元?方法可能不实际施工。 (现在您已将问题更改为int具体,复制和构建的费用是已知的和微不足道的,在大多数情况下,优化器可以指望将其删除)。

+0

在这个例子中最多设置两次实际上不应该导致两次写入(如果你有一个可怕的编译器,它可能会发生)。这种可能发生的唯一方法是如果类型是一些复杂的'struct'或object,'''操作符是一些复杂的函数。尽管如此,编译器应该足够聪明,以便在完成“A”和“B”的比较之前,不应该写出“MAX”。所以它应该将'MAX'识别为'A'的别名,并且只是加载'A'来执行比较(基本上这会将其更改为代码1)。 – Jared

+1

@我说的很多关于效率的问题早于编辑时说A和B是整数的问题。假设他们是字符串,那么你的“它应该把MAX认作是一个别名”听起来不错,但如果它消除了副作用,比如B.size()> A.capacity() –