【问题标题】:What operations on enumeration types are legal in C++? [closed]枚举类型的哪些操作在 C++ 中是合法的? [关闭]
【发布时间】:2012-04-07 02:58:02
【问题描述】:

这个问题快把我逼疯了。我需要把它做对,这样我才能通过我的课。感谢所有尝试它的人。

用 C++ 编写一个简单的程序来调查其枚举类型的安全性。在枚举类型上包含至少 10 种不同的操作,以确定哪些不正确或愚蠢的事情是合法的。

【问题讨论】:

  • 这是一个复杂的答案,我会尽快发布答案,但是,展示您目前所拥有的内容将对我们和您都有很大的帮助。
  • 哪个标准? C++03 还是 C++11?
  • 这怎么会“不是一个真正的问题”?他没有违反常见问题解答中的任何内容。
  • 原因是“不是一个真正的问题”,描述为“很难说出这里问的是什么。这个问题是模棱两可、含糊不清、不完整、过于宽泛或修辞的,不能合理以目前的形式回答”。不过,他问什么问题就清楚了,他问什么就能解决。我认为没有任何理由因为不喜欢发布和接受的答案而惩罚发帖者/社区。我并不想表现得好争辩,我只是好奇以备将来参考。

标签: c++ types operators enumeration


【解决方案1】:

这是一个完全可操作的程序,显示了十种不同类型的枚举操作。详情会在代码中,参考会在文章底部。

首先,了解枚举是什么非常重要。有关这方面的参考,请查看Enumerated Types - enums。在下面的代码中,我使用数学运算、位运算符并使用枚举值将数组初始化为默认大小。

#include <iostream>
using namespace std;

enum EnumBits
{
    ONE = 1,
    TWO = 2,
    FOUR = 4,
    EIGHT = 8
};

enum Randoms
{
    BIG_COUNT = 20,
    INTCOUNT = 3
};

int main(void)
{
    // Basic Mathimatical operations
    cout << (ONE + TWO) << endl;    // Value will be 3.
    cout << (FOUR - TWO) << endl;   // Value will be 2.
    cout << (TWO * EIGHT) << endl;  // Value will be 16.
    cout << (EIGHT / TWO) << endl;  // Value will be 4.

    // Some bitwise operations
    cout << (ONE | TWO) << endl;    // Value will be 3.
    cout << (TWO & FOUR) << endl;   // Value will be 0.
    cout << (TWO ^ EIGHT) << endl;  // Value will be 10.
    cout << (EIGHT << 1) << endl;   // Value will be 16.
    cout << (EIGHT >> 1) << endl;   // Value will be 4.

    // Initialize an array based upon an enum value
    int intArray[INTCOUNT];

    // Have a value initialized be initialized to a static value plus
    // a value to be determined by an enum value.
    int someVal = 5 + BIG_COUNT;

    return 0;
}

上面完成的代码示例可以用另一种方式完成,即为 EnumBits 重载 operator| 等。这是一种常用的技术,更多参考请见How to use enums as flags in C++?

有关按位运算的参考,请查看Bitwise Operators in C and C++: A Tutorial

使用 C++ 11,您可以通过其他方式使用枚举,例如 strongly typed enums

【讨论】:

  • 版主说明 此答案下的评论纯属杂音,已被清除。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多