什么"否定枚举"意思?

时间:2017-02-05 10:38:09

标签: c++ enums

我正在阅读一些代码而且我遇到了:namespace RocheClinicalTrial.Controllers { [AllowAnonymous] [Route("api/RocheClinicalTrial")] public class RocheClinicalTrialController : Controller { // GET: api/values [HttpGet] public JsonResult Get() { var repo = new Repository.Repository(); var data = repo.GetData(); return Json(data); } [Route("Details/{ItemName}")] //GET api/values/5 [HttpGet("api/values")] public string Get(SearchCriteria searchCriteria) { System.Console.WriteLine(searchCriteria); return "value"; } } } 其中value是以下枚举:

static_cast<uint32_t>(!value);

typedef enum PValue { Lo = 0b0, Hi } PValue; !value的结果是什么?

2 个答案:

答案 0 :(得分:2)

Lo的后缀整数值为01Hi。请注意,C中为!0 == 1,任何非零值!a == 0a。因此,此静态强制转换将评估为无符号1

答案 1 :(得分:1)

&#34;平原老&#34;枚举(即通过enum而非enum class声明的枚举)具有基础整数类型。从标准:

  

枚举的基础类型是可以的整数类型   表示枚举中定义的所有枚举器值。它是   实现定义的哪个整数类型用作底层   枚举的类型,但基础类型不应该是   大于int,除非枚举器的值不适合   int或unsigned int。如果枚举器列表为空,则为底层   type就好像枚举有一个值为0的枚举器。

也就是说,enum s基本上是标记的整数。即使在隐式转换下,您也可以将任何给定的enum类型转换为int并返回。由于未为operator!()类型定义enum,因此!a形式的表达式a属于enum类型,相当于{{1} }}。这意味着!static_cast<int>( a )对整数类型的通常规则适用:

operator!()

现在,在您的特定示例中:

 ______ ______
|      |      |
|   a  |  !a  |
|______|______|
|      |      |
| ==0  |   1  |
|______|______|
|      |      |
| !=0  |   0  |
|______|______|

typedef enum PValue { Lo = 0b0, Hi } PValue; 的积分表示为Lo,即使您没有明确指定它也是如此。由于没有明确设置,0的整数表示是Hi加一,即Lo

因此,1!Lo == !0 == 1 == Hi