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问题抱歉,但肯定很好奇。谢谢!
答案 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
。