我正在阅读一些代码而且我遇到了: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
的结果是什么?
答案 0 :(得分:2)
Lo
的后缀整数值为0
,1
为Hi
。请注意,C中为!0 == 1
,任何非零值!a == 0
为a
。因此,此静态强制转换将评估为无符号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
。