C++ 对数组索引中使用的int-0引用发出警告

C++ 对数组索引中使用的int-0引用发出警告,c++,C++,考虑以下代码: vector<int> a = {1, 2, 3, 4, 5}; cout << a[-0] << std::endl; 向量a={1,2,3,4,5}; 你是在向后看。事实上,在编译器中编写代码不让这个程序编译是毫无意义的,因为正如您所说的,-0表达式是完全有效的,并且相当于0 您必须为应用于具有此特定值的整数文本的一元-引入一个新的特例。。。为什么呢 如果你在写令人困惑的代码,那么坦率地说,那是你自己的错;编译器没有让您这样做。早期的编译

考虑以下代码:

vector<int> a = {1, 2, 3, 4, 5};
cout << a[-0] << std::endl;
向量a={1,2,3,4,5};
你是在向后看。事实上,在编译器中编写代码不让这个程序编译是毫无意义的,因为正如您所说的,
-0
表达式是完全有效的,并且相当于
0

您必须为应用于具有此特定值的整数文本的一元
-
引入一个新的特例。。。为什么呢


如果你在写令人困惑的代码,那么坦率地说,那是你自己的错;编译器没有让您这样做。

早期的编译过程之一可能会对常量项进行一些简化:例如,它可能会将
int x=0x100 | 0x001
转换为
int x=5
。负零可能在这个过程中得到简化


在某些上下文中,
-0
上的警告会增加编译器的复杂性,但增益很小。

C++允许有符号整数的3种不同表示:2的补码、1的补码和有符号大小

-0
不是整数文本,它是一个由文本
0
和一元
-
运算符组成的表达式

在2的补码(几乎所有现代系统都使用)中,
0
只有一种表示形式,因此
-0
的值和表示形式与
0
完全相同

在1的补码和有符号的幅值中,负零有一个不同的表示形式。(通过将1的补码中的所有位反转,或将符号大小中的符号位反转,或将所有位反转并将1与2的补码相加,可对整数求反。在后一种情况下,将此操作应用于所有位的零表示将产生相同的表示。)

我认为,在代码< >代码> 0代码>中,需要使用一元代码> ->代码>操作符,或者至少期望,得到与“代码>0”/CODE相同的表示形式,即使有负的零表示,但我无法在C++标准的快速扫描中确认这一点。在非二元补码系统中,可以创建一个

int
对象,该对象具有负零表示;这样一个对象的值在比较时仍应等于
0

在实践中,这不应该引起关注;在2的补码系统上
-0==0

如果编译器为
-0
生成警告,那可能是因为
-
无效,而不是因为它不正确


(很想知道为什么在你的代码中会出现
-0

对于浮点数来说,负零和正零是不同的数字。@当然可以,但这是用来引用数组索引的
int
?为什么不可以?这并没有错。编译器也会允许--1、--1等等。在这两种情况下,如果不比允许的更难的话,预防也是一样的。您要求的是关于非错误的警告或错误。我同意,我希望编写代码的人仍然在这里工作,以便我可以要求他修复它。但是有一些方法可以警告用户写得不好的代码,例如未使用的行
1+3
可以用标志抛出警告,有什么方法可以做到吗?@Ben我不知道有任何主流工具链可以配置为警告这种用法,没有。带有丢弃效果的语句比你发现的这个小角落要普遍得多!谢谢你的回答,我意识到序言和我想回答的问题彼此之间没有真正意义,所以我编辑了它。谢谢,这很好。我也想知道
-0
的出现情况。也许是一个笑话让它进入了存储库????