为什么循环迭代不会打印任何东西而不是其他东西?

时间:2017-06-10 19:17:57

标签: c++ string

2循环 - 只是一个简单的字符串反转。

但是,当我使用两种不同的结束状态时,我遇到了问题。我只是想'知道它为什么不打印任何东西。

for (unsigned int i = a.length() - 1; i != -1; i--)
    {
        b += a[i];
    }
    cout << a << "\n" << b << endl;

VS

for (unsigned int i = a.length() - 1; i > -1; i--)
    {
        b += a[i];
    }
    cout << a << "\n" << b << endl;

第二个不打印任何东西 - 寻找解释原因。

对于noob问题抱歉,但肯定很好奇。谢谢!

1 个答案:

答案 0 :(得分:0)

使用无符号整数值unsigned int i时,i > -1之类的条件永远不会变为真,而条件i != -1可能变为真。原因是,当提升为无符号值时,整数文字-1实际上与MAX_UNSIGNED相同。然后很容易看出unsigned int类型的值永远不会大于MAX_UNSIGNED,而它可能会!= MAX_UNSIGNED

请尝试以下代码:

unsigned int ui = -1;
printf("ui:%u ; MAX_UNSINGED: %u\n", ui, UINT_MAX);

bool onegreaterMinusOne = (1 > ui);
printf("1 > -1 in unsigned realm? %s\n", (onegreaterMinusOne ? "True" : "False"));

unsigned int anotherUI = 0;
printf("0 != -1 in unsigned realm? %s\n", (anotherUI != ui) ? "True" : "False");

anotherUI--;
printf("--anotherUI != -1 in unsigned realm? %s\n", (anotherUI != ui) ? "True" : "False");

输出:

ui:4294967295 ; MAX_UNSINGED: 4294967295
1 > -1 in unsigned realm? False
0 != -1 in unsigned realm? True
--anotherUI != -1 in unsigned realm? False

有点微妙是最后一件事,其中unsigned int anotherUI=0; anotherUI--;被评估(这对应于第一个循环的最后一步),因为有人可能会询问“无符号下溢是否定义为行为”。答案是肯定的,取自C ++标准(并从this SO answer复制而来 ):

  

[...]涉及无符号操作数的计算永远不会溢出,   因为结果无法由结果无符号表示   整数类型以模数减少为1   可以由结果类型表示的最大值。 (ISO / IEC   9899:1999(E)§6.2.5/ 9)

所以(unsigned)0 - (unsigned)1等于-1 modulo UINT_MAX+1,换句话说,UINT_MAX