switch语句重复错误

时间:2014-02-26 12:16:04

标签: c switch-statement

#include<stdio.h>
int main()
{
  int a=5;
  switch(a)
  {
   case 1: ;
   case 2:;
   case 3+5:;
   case a:;

  }
}

编译这个程序,我得到两个错误:

  • 需要常量表达式,这是可以预期的。
  • 第二个错误表示重复case。此处case a:case 1:重复。为什么第二个错误产生错误?在a中,值为5,在案例1中为1.如何5和1可以发生冲突。

5 个答案:

答案 0 :(得分:2)

当编译器遇到错误时,它会尝试恢复并继续。这意味着它试图将代码更改为它认为的含义(或者根本没有),并且只是在错误的代码之后继续。

一般来说,只有第一个编译器错误100%正确,以下可能只是“附带损害”,并且根本就没有实际意义。

答案 1 :(得分:2)

当您看到多个编译器错误时,唯一通常有意义的错误是第一个错误。第二个错误通常是编译器在从上一个错误中恢复过程中报告的“杂散错误”。编译器通常会遇到单个错误导致它们处于恢复之前产生其他几个错误的状态。它们报告的错误通常也不同:例如,gcc编译器在a错误后生成“冒号”。

回到您的程序,即使您声明它const,也无法使其与变量一起使用,因为C不会考虑来自a的{​​{1}}编译 - 时间常数。进行编译的唯一方法是使用预处理器const int a = 5(在#define a 5后也需要冒号)。

如果将a添加到const的声明中,则可以使用C ++编译器编译此程序。这是demo on ideone

答案 2 :(得分:1)

c99 6.8.4.2
The expression of each case label shall be an integer constant expression and no two of
the case constant expressions in the same switch statement shall have the same value
after conversion. There may be at most one default label in a switch statement. (Any   
enclosed switch statement may have a default label or case constant expressions with  
values that duplicate case constant expressions in the enclosing switch statement.)

对于必须为整数常量

的情况,不能有变量
case (integer Constant Expression) :
case a: this is not an integer constant expression

答案 3 :(得分:0)

case总是采用int或char形式的常量值,但是你无法使用它来比较变量。

你的第二个错误是编译器依赖的。所以不要卡在那里继续!!!

答案 4 :(得分:-1)

你应该总是给整数常量作为大小写值,这就是你的开关在'case a'给出错误的原因。用整数常量替换它。