【问题标题】:C++ Beginner: Shortcuts on SwitchC++ 初学者:Switch 上的快捷方式
【发布时间】:2020-04-30 12:18:27
【问题描述】:

我试图为一个练习编写此代码,该练习显示并允许用户通过输入与他们选择的饮料相对应的数字 (1 - 5) 来选择饮料。然后它会打印出指定他们选择的饮料,如果他们输入了 1-5 之外的任何内容,则会显示错误消息。

下面是功能代码:

#include <vector>

std::string Vending (){
int num;
std::vector<std::string> beverage ={"Coke", "Sprite", "Water", "Pepsi", "7-Up"};
std::cin >> num;
switch (num){
  case (1) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (2) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (3) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (4) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (5) :
  std::cout << "You have chosen " << beverage[num-1];
  break;

default :
 std::cout << "Error, choice was not valid, here is your money back.\n";
 break;
}
}

该程序运行良好,但我只是想知道是否有一种方法可以使 switch() 更短,例如在 case 中放置一个范围。 case(//range from 1-5) 而不是根据案例编号单独编写每个案例。

任何提示将不胜感激! :)

【问题讨论】:

  • 提示:请注意,在每种情况下,您的代码都是完全相同的。如果您在所有情况下执行完全相同的操作,您是否只需要执行该操作?
  • GCC 支持 case 1 ... 5 作为编译器扩展

标签: c++ switch-statement


【解决方案1】:

if 语句在这里更合适,因为switch 块并非设计用于在范围上操作。

如果您必须使用switch,并且热衷于编写可移植的 C++(因此 gcc 范围 switch 不是一个选项),那么您可以编写

switch (num){
case 1: case 2: case 3: case 4: case 5:
    std::cout << "You have chosen " << beverage[num-1];
    break;
default :
     std::cout << "Error, choice was not valid, here is your money back.\n";
}

但是写起来会更自然

if (num >= 1 && num <= beverage.size()){
    std::cout << "You have chosen " << beverage.at(num - 1);
} else {
    std::cout << "Error, choice was not valid, here is your money back.\n";
}

还有一个额外的好处是我没有硬编码饮料的数量。使用at 还可以帮助您防止未定义的行为,因为始终进行向量边界检查(即使该语句当前由if 保护)。

【讨论】:

  • @NathanOliver:因为 IO 将成为瓶颈,我只喜欢在性能关键的情况下使用[]。我的一个习惯,一个很好的习惯,如果我自己可以这么说的话。如果我在用at 替换[] 时遇到的每个异常都有一美元,我确实会成为一只非常非常富有的猫。我想另一种方法是使用at 并在抛出异常时捕获异常(放弃if 块),但这对我来说似乎很脆弱。
  • 哇哦!我忘了提到练习的第二部分是将 if/switch 语句转换为另一个。这太有帮助了!非常感谢! :)
【解决方案2】:

您根本不需要switch 或任何类型的选择,只需一些基本检查输入是否在范围内,然后打印它:

if (num > 0 && num <= beverage.size())
{
    std::cout << "You have chosen " << beverage[num-1];
}
else
{
    std::cout << "Error, choice was not valid, here is your money back.\n";
}

【讨论】:

  • 谢谢你!我忘了提到练习的一部分是练习使用 if/switch 语句。
  • @Sebastian switch 可以工作,如另一个答案所示。但我当然希望你的老师会告诉你,一旦所有学生都返回了答案,这对这个练习不是很好:一个'switch'有固定数量的案例,每个案例必须是一个编译 -时间常数。如果你想在向量中添加或删除元素,caselist 需要修改,而if 范围检查则不需要。
  • 哦,我明白了!记住这一点非常重要。再次感谢你! :)
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多