Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将switch中的case条件用作c++;?_C++_C++11 - Fatal编程技术网

C++ 如何将switch中的case条件用作c++;?

C++ 如何将switch中的case条件用作c++;?,c++,c++11,C++,C++11,这里的x,y,z是整数,但它们在开始时是未知的。在运行期间,它将计算x,y,z的值。我想使用这些值作为case条件 有没有办法在开关中使用这些值 如果使用if-else循环,则不使用switch,ho 否,案例标签需要是编译时整数常量 您将需要改用条件语句: if (id == x) { // ... } else if (id == y) { // ... } else if (id == z) { // ... } else { // "default case" } 还

这里的
x
y
z
是整数,但它们在开始时是未知的。在运行期间,它将计算
x
y
z
的值。我想使用这些值作为case条件

  • 有没有办法在开关中使用这些值
  • 如果使用if-else循环,则不使用switch,ho

  • 否,案例标签需要是编译时整数常量

    您将需要改用条件语句:

    if (id == x) {
      // ...
    } else if (id == y) {
      // ...
    } else if (id == z) {
      // ...
    } else {
      // "default case"
    }
    

    还要考虑到
    x
    y
    z
    可能并不都是不同的,因此语句的顺序很重要。(但如果您遇到任何一个问题,则顺序对
    开关中的大小写标签也很重要。)

    正如n.m,Kerrek SB所指出的那样,大小写标签需要是编译时积分常数。 Kerrek SB的答案显示了直接直观的
    if-else if
    -级联解决方案。 但是,如果您还想使用
    switch
    -语句中的
    break
    -功能,则以下
    if-if
    -级联为通用模式将适用:

    bool isBreak = false;
    if (id==x) {
        ...
        isBreak = true;
    }
    if (!isBreak && id==y) {
        ...
    }
    if (!isBreak) {
        ...
    }
    

    注意,与
    switch
    相反,使用此模式,您可以表示多个
    case
    -语句(表示为
    if
    s)匹配的情况,例如,当
    x==y
    不支持您想要的内容时(如其他答案所指出)。然而,更糟糕的是,它是不明智的,因此不能以任何方式模仿。这是因为
    开关
    中的
    案例
    s是唯一的,并且它们的顺序不重要(除非是在失败的情况下),因此

    开关(枚举对象){
    案例A:返回foo();
    案例B:返回foo();
    默认值:返回foo();
    }
    

    开关(枚举对象){
    默认值:返回foo();
    案例B:返回foo();
    案例A:返回foo();
    }
    
    给出相同的代码,但是

    if(id == run_time_value_A)
      return foo<A>();
    if(id == run_time_value_B)
      return foo<B>();
    return foo<C>();
    
    if(id==运行时间值)
    返回foo();
    if(id==运行时间值)
    返回foo();
    返回foo();
    
    和,比方说,

    if(id == run_time_value_B)
      return foo<B>();
    if(id == run_time_value_A)
      return foo<A>();
    return foo<C>();
    
    if(id==运行时间值)
    返回foo();
    if(id==运行时间值)
    返回foo();
    返回foo();
    

    如果
    run\u-time\u-value\u-B==run\u-time\u-value\u-A

    我不理解你的最后一句话,因为案例标签必须是不同的?@alain:是的,但它们的顺序很重要,这是我试图表达的观点(很糟糕)。在我的情况下,顺序并不重要。我可以把案例1写在第二位。另外,我尝试的是10个案例。根据输入,其中将使用一定数量的案例,例如5个案例。这些箱子标签将相应设置。其余的将不使用,并且不会被调用,因为开关值不会调用这些情况。
    switch(enum_object) {
    default: return foo<C>();
    case B: return foo<B>();
    case A: return foo<A>();
    }
    
    if(id == run_time_value_A)
      return foo<A>();
    if(id == run_time_value_B)
      return foo<B>();
    return foo<C>();
    
    if(id == run_time_value_B)
      return foo<B>();
    if(id == run_time_value_A)
      return foo<A>();
    return foo<C>();