代码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;
在上面的程序逻辑中,哪一个是最好的,为什么?它们之间有什么区别吗?这是我的考试题,我想问一下堆栈溢出来了解最佳意见。
答案 0 :(得分:5)
MAX = std::max(A, B);
在清晰度方面优于两者。
就速度而言,编译器应该能够优化这些方法中的任何一个;但我再次赞成std::max
,因为我很快就会相信编译器优化标准函数而不是任意组成的代码来执行相同的任务。
答案 1 :(得分:1)
它们是相同的,所以我更喜欢代码1,因为它更具可读性。在这两种情况下,您必须将A和B都放入寄存器(无论如何),然后进行单次比较(无论如何)。并且它不会写出变量MAX直到完成该段之后(因为它不需要从寄存器中踢出任何东西)。
这不会导致任何性能提升。实际上,编译器可能会编译它们(编译器会进行各种代码修改以创建最佳指令集),这是可能的(尽管我对此表示怀疑)。
正如所建议的,唯一可能带来性能提升的是使用库函数std::max
。这是因为编译器基本上会以最有效的方式执行比较(可能甚至没有调用条件跳转)。如果你的两个值是整数,那么你可以看到here可以通过五个整数运算找到最大值(除了乘法通常可以在一个循环中完成)。您通常希望尽可能避免条件跳转,此算法可以做到这一点。很可能max函数执行类似或类似的操作(但浮点值必须不同)。
答案 2 :(得分:1)
在MAX = std::max(A,B)
之后,下一个最佳代码是:
MAX = A > B ? A : B;
如果您不想使用它,那么我更喜欢您的“代码1”,因为:
代码2始终设置MAX = A
,这暂时具有误导性,只有在后面的代码被研究时才变得清晰;虽然这个问题在C ++和许多其他语言中很常见,但是当它很容易避免时,没有特别的理由接受这种复杂性
对于某些类型(问题最初没有指定int
),分配可能是一项昂贵的操作(例如复制大量数据),因此总是分配一次比分配两次更好
出于这两个原因,还需要在一个步骤中声明和定义MAX
。如果说它是一个非const
引用被接受为函数参数可能不实际,但是当它有可能时,这是另一个更好的理由来选择std::max
或三元?
方法:你不需要误导和潜在低效或不可用的默认构造。 (现在您已将问题更改为int
具体,复制和构造的费用是已知且微不足道的,并且在大多数情况下可以依靠优化器将其删除。)
答案 3 :(得分:0)
我会说使用代码2.它更好,因为你明确地说如果MAX B大于MAX A,那么将MAX改为B.在另一个中,你没有任何关于为什么的定义因素MAX A大于MAX B.从我看来,使用代码1可能比使用代码2更难。