C++ 是0-1+;对于无符号变量,1是否始终等于0?

C++ 是0-1+;对于无符号变量,1是否始终等于0?,c++,increment,undefined-behavior,unsigned,c++98,C++,Increment,Undefined Behavior,Unsigned,C++98,在以下代码的末尾,x是否始终等于0?或者这是一个未定义行为的例子 unsigned long int x = 0; --x; ++x; 注:C++98上下文。出于某种(好的)原因,我不能使用C++11 为什么要问这个问题? 我必须遍历一个容器,逐个索引,删除一些元素。我希望通过以下方式实施该计划: MyContainerWithoutIterators c; //... for(unsigned long int i = 0; i < c.size(); ++i) { if(i_ha

在以下代码的末尾,
x
是否始终等于
0
?或者这是一个未定义行为的例子

unsigned long int x = 0;
--x;
++x;
注:C++98上下文。出于某种(好的)原因,我不能使用C++11

为什么要问这个问题?

我必须遍历一个容器,逐个索引,删除一些元素。我希望通过以下方式实施该计划:

MyContainerWithoutIterators c;
//...
for(unsigned long int i = 0; i < c.size(); ++i)
{
  if(i_have_to_remove(c[i]))
  {
    c.removeAtIndex(i);
    --i; // counterbalance incrementation of the loop
  }
}
mycontainer不带迭代器c;
//...
for(无符号长整数i=0;i
注意:我知道我可以做到以下几点,我只是想知道我是否可以使用前面的实现

MyContainerWithoutIterators c;
//...
for(unsigned long int i = 0; i < c.size();)
{
  if(i_have_to_remove(c[i]))
    c.removeAtIndex(i);
  else
    ++i;
}
mycontainer不带迭代器c;
//...
for(无符号长整数i=0;i
无符号溢出定义良好。签名溢出不是,但您的示例中没有签名溢出。为什么不使用签名数字呢?您真的需要unsigned的额外空间吗?@twain249我猜c.size()返回unsigned,所以索引也需要unsigned以避免warnings@twain249:也许
c.size()
是一个
无符号长整数
。同时为了一致性:我总是使用无符号变量作为索引。@HolyBlackCat 3.9.1/4在N4141中:“无符号整数应遵守算术模2^n定律,其中n是该特定整数大小的值表示中的位数。”以及相应的脚注48:“这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果将被减少为比结果无符号整数类型可以表示的最大值大一的数的模。“Tl;DR:不要依赖C++相关的维基百科。无符号溢出定义良好。签名溢出不是,但您的示例中没有签名溢出。为什么不使用签名数字呢?您真的需要unsigned的额外空间吗?@twain249我猜c.size()返回unsigned,所以索引也需要unsigned以避免warnings@twain249:也许
c.size()
是一个
无符号长整数
。同时为了一致性:我总是使用无符号变量作为索引。@HolyBlackCat 3.9.1/4在N4141中:“无符号整数应遵守算术模2^n定律,其中n是该特定整数大小的值表示中的位数。”以及相应的脚注48:太长了,读不下去了,这意味着无符号算术不会溢出,因为不能用C++生成的无符号整数类型表示的结果是模数大于一个最大值的数字,它可以由得到的无符号整数类型表示。