#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可以发生冲突。答案 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'给出错误的原因。用整数常量替换它。