- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
说,我们有
enum E
{
Foo = 0,
Bar = 1
};
现在,我们开始了
enum E v = ( enum E ) 2;
然后
switch ( v )
{
case Foo:
doFoo();
break;
case Bar:
doBar();
break;
default:
// Is the compiler required to honor this?
doOther();
break;
}
由于上面的开关处理枚举的每个可能列出的值,编译器是否允许优化掉上面的 default
分支,或者在值的情况下具有未指定或未定义的行为的枚举不在列表中?
我期望 C 和 C++ 的行为应该是相似的,所以问题是关于这两种语言的。但是,如果在这种情况下 C 和 C++ 之间存在差异,那么也很高兴知道这一点。
最佳答案
在 C++ 中,每个枚举都有一个基础的整数类型。如果明确指定(例如:enum test2 : long { a,b};
)或者如果是 int
,则它可以是固定的默认情况下是 scoped 枚举(例如:enum class test { a,b };
):
[dcl.enum]/5: Each enumeration defines a type that is different from all other types. Each enumeration also has an underlying type. (...) if notexplicitly specified, the underlying type of a scoped enumeration typeis int. In these cases, the underlying type is said to be fixed.
对于底层类型未明确固定的 unscoped 枚举(您的示例),该标准为您的编译器提供了更大的灵 active :
[dcl.enum]/7: For an enumeration whose underlying type is not fixed, the underlying type is an integral type that can represent all theenumerator values defined in the enumeration. (...) It is implementation-defined which integral type is used as the underlyingtype except that the underlying type shall not be larger than intunless the value of an enumerator cannot fit in an int or unsignedint.
现在是非常棘手的事情:枚举变量可以保存的值取决于底层类型是否固定:
如果是固定的,"枚举的值就是基础类型。”
否则,最小位域的最小值和最大值内的整数值可以容纳最小的枚举数和最大的枚举数。
您属于第二种情况,尽管您的代码可以在大多数编译器上运行,但最小位域的大小为 1,因此您可以在所有兼容的 C++ 编译器上确定的唯一值是 0 到 1 之间的值。 ..
结论:如果你想确保该值可以设置为 2,你要么必须让你的枚举成为一个作用域枚举,要么显式指明一个底层类型。**
更多阅读:
C的情况要简单得多(C11):
6.2.5/16: An enumeration comprises a set of named integer constant values. Each distinct enumeration constitutes a different enumeratedtype.
所以基本上,它是一个 int:
6.7.2.2./2 The expression that defines the value of an enumeration constant shall be an integer constant expression that has a valuerepresentable as an int.
有以下限制:
Each enumerated type shall be compatible with char, a signed integertype, or an unsigned integer type. The choice of type isimplementation-defined, but shall be capable of representing thevalues of all the members of the enumeration.
关于c++ - 是否允许枚举具有未列出的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812998/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!