在C语言中生成枚举编译错误
我试图通过在VS2010中运行以下代码来生成枚举编译错误:在C语言中生成枚举编译错误,c,enums,C,Enums,我试图通过在VS2010中运行以下代码来生成枚举编译错误: typedef enum {F,E,D,C,B,A} grade_t; main(){ grade_t james=E+A; printf("%d",james); } 但是,它仍然运行并将6打印到屏幕上。 据我所知,应该只为james分配枚举定义的常量。在编写上述作业时,我还收到了预期的编译错误: IntelliSense: a value of type "int" cannot be used to initia
typedef enum {F,E,D,C,B,A} grade_t;
main(){
grade_t james=E+A;
printf("%d",james);
}
但是,它仍然运行并将6打印到屏幕上。
据我所知,应该只为james分配枚举定义的常量。在编写上述作业时,我还收到了预期的编译错误:
IntelliSense: a value of type "int" cannot be used to initialize an entity of type "grade_t"
1) 为什么它在超出范围的情况下运行?2) 这是否意味着某些编译错误可能被视为逻辑错误?枚举只是整数。C标准规定,枚举变量应对应于标准整数类型之一,通常为
char
、int
或无符号int
。坦率地说,C标准(6.7.2.2)是延迟的,允许枚举变量具有实现定义的类型,而枚举常量(F、E、D等)必须具有int类型。这是标准本身的“错误”/不一致
因此grade\t james=E+A
完全等同于等级(james=(int)E+(int)A ;代码>。由于枚举常量必须是int类型,因此编译器不可能执行任何类型检查,标准也不强制执行任何类型检查。它不会查看此int
值的内容来进行某种合理性检查
然后将整数相加的结果(类型为int
)存储在grade\u t
变量中。在这里,编译器可能会产生一个警告,您的编译器似乎会这样做。但这并不是必须的。C在类型安全和超出范围检查方面很少
2) 这是否意味着某些编译错误可能被视为逻辑错误
不知道你在这里是什么意思。您不应该从发布的代码中得到任何编译器错误。请注意VisualStudio在遵循C标准时是很差的,默认情况下它是C++编译器。C++比C有更严格的类型规则,所以如果你在C++中编译C代码,你会得到更多的警告/错误。 < P>这就是正在发生的
typedef enum {F,E,D,C,B,A} grade_t;
等于
typedef enum {
F = 0 ,
E = 1,
D = 2,
C = 3,
B = 4,
A = 5
} grade_t;
因此,在使用A、B、C、D、E、F的任何位置,都会选择等效枚举值。。。所以
A+E=1+5=6
因此,您可以看到没有任何东西会产生错误。您是说,使用类型为grade\t的变量james不应该对其允许值有任何限制吗?如果与int相同,为什么要使用此grade\u t类型?是的。。。即使在那时也没有问题。。。typedef之所以使用,是因为它们提供了简单性,一个包装器使它们在不同的平台上具有相同的大小(例如,32位和64位操作系统提供了不同大小的变量,编译器也可以产生差异),所以这些差异在一些单独的文件中处理,然后提供typedef以供使用。。。此外,如果几个月后您想使用相同的代码,但使用不同类型的等级,则只需更改1行,而不是替换所有发生的情况。您写道:“由于枚举常量必须为int类型,编译器不可能执行任何类型检查”。但是编译器将wong赋值识别为错误,并让我运行它。如果VS2010发现编译错误,我希望它能正常工作,不会将源代码编译成可执行文件。@c-seeker您确定运行的是当前版本的可执行文件吗?此外,如果它给出了一个错误,你确实可能编译C作为C++,这不是一个好主意。@ C-Ekk:你熟悉错误和警告之间的区别吗?我正在运行当前版本。对结果中反映的值的更改。我不是一个软件,我在VS2010中可以选择以不同的方式运行C程序?我有一个错误窗口和一个运行窗口,每个错误都会出现。