为什么这个 C++ 循环不能无限运行?

时间:2021-06-04 04:10:26

标签: c++

我看着我的朋友试图解决一个编程挑战,有一次,他的代码是这样的:

#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()),为什么这个循环会终止?

2 个答案:

答案 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],这会导致未定义的行为(可能包括崩溃、显示垃圾值或程序似乎正常工作)。