C++ 为什么这个C++;循环不是无限运行吗?

C++ 为什么这个C++;循环不是无限运行吗?,c++,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

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

#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;
    }
}
#包括
#包括
使用名称空间std;
int main(){
//提示用户输入字符串
常量字符串空间{“”};
字符串输入;
cout
input.length()
返回一个无符号值(
size\t
)。这将导致将
k
提升(转换)为无符号值,然后进行比较

k
为-1时,它将被提升为一个非常大的正数,该正数将不小于字符串长度

但是,即使在这种情况发生之前,您也会访问
input[-1]
,这会导致未定义的行为(可能包括崩溃、显示垃圾值或程序看起来工作正常)。

input.length()
返回一个无符号值(
size\t
)。这会导致
k
被提升(已转换)为无符号值,然后进行比较

k
为-1时,它将被提升为一个非常大的正数,该正数将不小于字符串长度


但是,即使在这种情况发生之前,您也可以访问
input[-1]
,这会导致未定义的行为(可能包括崩溃、显示垃圾值或程序看起来工作正常)。

注意比较
k
,其中
input.length()
返回无符号
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
int main(){
int i=-1;
尺寸s=10;
std::cout s)s)是真的

注意比较
k
,其中
input.length()
返回无符号的
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
int main(){
int i=-1;
尺寸s=10;
std::cout s)s)是真的

即使这样做有效,我90%确定这是未定义的行为。告诉你的朋友他的代码随时可能失败。说得好!我错误地认为它实际上会导致segfault。我想知道为什么它不会这样做?看起来像是segfault情况。即使这样做有效,我90%确定这是未定义的行为。告诉你的friend他的代码可能随时都会失败。说得好!我错误地认为它实际上会导致segfault。我想知道为什么它不这样做?似乎是segfault的情况。非常感谢!作为后续,为什么出于比较的目的从int转换为无符号值?为什么不转换大小是否改为有符号值?@Kevin,因为这是语言定义的行为方式。这是有道理的,尽管我很好奇,他们没有用另一种方式定义它,因为这样似乎可以避免像这样令人惊讶的结果。@Kevin否则,你会惊奇地发现大尺寸变成负值。;)好的point!我想这些惊喜只是乐趣中不可避免的一部分:)非常感谢!作为后续,为什么要将int值转换为无符号值以进行比较?为什么不将size\u t转换为有符号值?@Kevin,因为这是语言定义的行为方式。有道理,尽管如此呃,让我好奇的是,他们没有用另一种方式来定义它,因为它似乎会避免出现这样令人惊讶的结果。@凯文,否则,你会有一个大尺寸的惊喜变成负值。;)说得好!我想这样的惊喜只是乐趣中不可避免的一部分:)