首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码不应该打印“11”而不是"4 4“吗?

代码不应该打印“11”而不是"4 4“吗?
EN

Stack Overflow用户
提问于 2014-04-27 12:38:48
回答 4查看 1.2K关注 0票数 13

根据第7.2/5和第7.2/6节,代码如下不应该打印1 1而不是4 4

代码语言:javascript
复制
#include <iostream>
enum A { a = (char)1, b, c };   //  underlying type is not fixed

int main() {
    std::cout << sizeof(a) << ' ' << sizeof(A) << '\n';
}

编辑

第7.2/5节: 如果基础类型没有固定,则每个枚举数的类型是其初始化值的类型: -如果为枚举器指定了初始化器,则初始化值具有与表达式相同的类型,且常量表达式应为整数常量表达式(5.19)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-27 12:45:37

如果您没有显式地定义底层类型,那么编译器可以自由地选择适合这些值的整型。若要在C++11中设置基础类型,可以使用以下方法:

代码语言:javascript
复制
enum A : char { a = 1, b, c }; 
       ^^^^^^

如果使用char,您的方式不会强迫编译器使用int

票数 20
EN

Stack Overflow用户

发布于 2014-04-27 12:42:25

这是实现定义的:一个enum的所有值都符合,比如说,一个uint8_t并不强制编译器为枚举选择一个单字节的表示。

枚举的基础类型是一个整体类型,可以表示枚举中定义的所有枚举数值。它是实现定义的哪种整数类型被用作枚举的基础类型,除非枚举器的值不能适合于int或unsigned int,否则基础类型不得大于int。(强调后加)

在您的示例中,编译器实现者似乎选择了一个int,它在您的平台上花费四个字节--这是一个非常有效的选择。

票数 5
EN

Stack Overflow用户

发布于 2014-04-27 12:42:55

引用的子句7.2/5描述了枚举器的类型。但是枚举数只构成枚举定义的一部分。枚举的底层类型足够大,足以容纳所有枚举数的值,但必须符合7.2/6:

它是实现定义的,使用哪种整数类型作为基础类型,但基础类型不得大于int,除非枚举器的值不能适合于intunsigned int

因此,可以保证基础类型不大于int (因为int可以表示0、1和2)。确实,第一个枚举器的类型是枚举定义中的char,但是所有实际枚举值都是A类型。要实际控制底层类型,可以使用枚举基语法(例如enum A : char),并使用std::underlying_type特征来查询它。

如果您实际上希望在定义中看到枚举数类型的效果,可以尝试如下所示:

代码语言:javascript
复制
enum Foo { a = '\010', b = sizeof(a) };

std::cout << typeid(b).name() << "\n";    // some variant of "Foo"
std::cout << b << "\n";                   // "1"
std::cout << sizeof(b) << "\n";           // implementation-defined, not greater
                                          // than sizeof(int)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23323510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档