Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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语言中生成枚举编译错误_C_Enums - Fatal编程技术网

在C语言中生成枚举编译错误

在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

我试图通过在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 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程序?我有一个错误窗口和一个运行窗口,每个错误都会出现。