我到处都看了,我不敢相信这个问题以前没有问过。
该标准是否定义了范围内的枚举数的顺序? 说我是否有以下内容
#include <iostream>
enum class Fruits {Apple, Orange, Tomato};
int main(){
std::cout << (Fruits::Apple < Fruits::Orange);
std::cout << (Fruits::Orange > Fruits::Tomato);
return 0;
}
// output:
// 1 0
以g ++输出1 0。但是这个标准或编译器是特定的吗?
答案 0 :(得分:2)
值的顺序在[dcl.enum] point 2中指定:
如果第一个枚举器没有初始化程序,则 对应的常数为零。没有枚举的枚举数定义 初始化程序为枚举器提供通过增加 前一个枚举数的值加一。
因此,Fruits
的值分别为0, 1, 2
,并且由于对枚举的比较只不过是类型安全的整数运算而已,因此其行为如您所见。
答案 1 :(得分:2)
要完成图片并确认是,请定义顺序。我们从为什么一个人可以在关系表达式中放置两个枚举数开始...
[expr.rel]
2通常的算术转换是对 算术或枚举类型...
5如果两个操作数(转换后)都是算术或 枚举类型,如果 指定的关系为true,如果为false,则为false。
...其中范围枚举的常规算术转换是无操作...
[expr]
9许多期望算术或 枚举类型原因转换和收益结果类型类似 办法。目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下:
- 如果任何一个操作数都属于范围枚举类型([dcl.enum]),则不执行任何转换;如果另一个操作数不相同 类型,则表达式格式不正确。
因此它们不进行转换,并且只能与完全相同类型的对象进行比较。赋予枚举数的值(由另一个答案指定)是确定“如果指定的关系为true,则每个运算符应产生true,如果为false,则为false” 。比较就是这样。
还值得注意的是,枚举类型变量可以采用未枚举的值!例如...
int basicwage, overtimewage, overtime, loyalty, salary;
int check = 0;
string X = "y", qualification, id;
while (X == "y" || X == "Y") {
cout << "ENTER THE STAFF ID :" << endl;
cin >> id;
cout << "ENTER THE Qualification :" << endl;
cin >> qualification;
while (check == 0) {
if (qualification == "alevel")
check = 1;
else if (qualification == "diploma")
check = 1;
else if (qualification == "degree")
check = 1;
else if (qualification == "master")
check = 1;
else {
cout << "ERORR qualification doesn't exist Please enter the right one"
<< endl;
cout << "ENTER THE Qualification again :" << endl;
cin >> qualification;
}
}
}
...是有效的,并且比较enum class foo {
min, max = 10
};
foo mid = static_cast<foo>(5);
将保持不变,因为前一段被概括为不仅仅包含命名值。