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(){
//提示用户输入字符串
常量字符串空间{“”};
字符串输入;
coutinput.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,因为这是语言定义的行为方式。有道理,尽管如此呃,让我好奇的是,他们没有用另一种方式来定义它,因为它似乎会避免出现这样令人惊讶的结果。@凯文,否则,你会有一个大尺寸的惊喜变成负值。;)说得好!我想这样的惊喜只是乐趣中不可避免的一部分:)