我看着我的朋友试图解决一个编程挑战,有一次,他的代码是这样的:
#include <iostream>
#include <string>
using namespace std;
int main(){
//Prompt user to enter string
const string SPACE {" "};
string input;
cout << "Please enter String you would like to see in a pyramid: ";
getline(cin, input);
//Iterate string
for(int i {0}; i < input.length(); i++){ //Going through each character in string...
for(int j {0}; j <= i; j++){ //Going through each character in string from 0 to i...
cout << input[j];
}
for (int k {i}; k < input.length(); k--){ //Going backwards from string.length() to 0
cout << input[k - 1];
}
cout << endl;
}
}
我的问题是,为什么第三个 for 循环(最后一个循环)不会导致无限循环? k = 0 作为第一次迭代的初始条件(因为 i = 0),每次迭代 k 递减 1。由于终止条件理论上应该总是为假(对于正整数长度的字符串,k 应该总是小于 input.length()),为什么这个循环会终止?
答案 0 :(得分:5)
注意比较 k < input.length()
,其中 input.length()
返回 unsigned string::size
。如果 k
为负,则 int
将被转换,因此其负值将变为正值。
如果当时 k
为 -1,则此值将是 string::size
的可能的最大值。尝试打印出这些值并亲自查看。
例如:
int main () {
int i = -1;
size_t s = 10;
std::cout << (i > s) << std::endl;
}
// Prints 1, which means the (i > s) is true
答案 1 :(得分:3)
input.length()
返回一个无符号值 (size_t
)。这导致 k
被提升(转换)为无符号值,然后进行比较。
当k
为-1时,会提升为Very Large Positive Number,不会小于字符串长度。
但是,即使在这种情况发生之前,您也访问了 input[-1]
,这会导致未定义的行为(可能包括崩溃、显示垃圾值或程序似乎正常工作)。