0
int main() 
{ 
   int year;
   cin>>year; 
  
    
        switch (year)  
        { 
        case 1000 ... 1500: 
            cout<<"less than 1501";
            break; 
        case 1502 ... 2500: 
            cout<<"greater than 1501"; 
            break; 
        case 1501:
            cout<<"1501";
        } 
     
    return 0;
    
}  

这是更有效还是:-

if(year<1501)
{ 
 cout<<"less than 1501";
}

else if(year>1501 && year<2700)
{
 cout<<"greater than 1501 but less than 2700";
}

这是一个小例子,但如果范围很大并且案例数量也很多,那么 switch case 方法或 if-else 会更好。

4

2 回答 2

3

对于初学者来说,case 1000 ... 1500这不是有效的 C++ 语法。如果您的意思是要列出case1000 到 1500 之间的每个人,让我告诉您这是个坏主意。代码最重要的是它的可读性,拥有 500 个连续案例与干净的代码完全相反。

您还应该知道的另一件事是,switchandif语句不等同于它们被编译成的内容。if并被if else编译成简单的条件跳转,而switch通常被编译成查找表,其中个别情况的值用作地址表的偏移量,并基于此您的代码将无条件跳转到相应的代码段。这不是保证行为,如果您有随机的案例值,则不会出现这种情况,但在正确的条件下(例如enums),它有可能被编译为查找。最终结果是,对于好的情况,您没有分支(范围检查除外)并且您的代码将执行得更快一些。

请记住,尽管现代硬件速度非常快,您根本不会注意到和之间的区别switchif除非它在您的内部hot path,即使这样,单个缓存未命中也会产生更大的影响。出于这个原因,您应该始终专注于编写易于理解且最有意义的代码。至于编译,同样,这是您支付一次的“价格”,因此您根本不应该关心。switch我对和之间的编译时间差异的有根据的猜测ifswitch会慢一点,但无论如何你都不会注意到它。

于 2021-01-16T14:09:02.743 回答
1

更高效、更易读并使用正确的 C++ 语法可能是:

template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

switch( sgn(year-1501) ) {
    case -1: std::cout << "less"; break;
    case  0: std::cout << "equal"; break;
    case  1: std::cout << "bigger"; break;
}
std::cout << std::endl;

(感谢https://stackoverflow.com/a/4609795sgn()实施)。但是对于这么小的函数,我几乎不怀疑你会注意到执行时间的任何差异,所以我建议你以最易读的方式实现它,然后在必要时担心性能。

于 2021-01-16T14:47:30.743 回答