我是编程新手,现在我正在学习Bjarne Stroustrup撰写的一本书(" 2014年编程原理和实践使用C ++")。无论如何,我遇到的问题是当我定义一个字符串时,程序停止正常工作。这是代码:
#include <iostream>
using namespace std;
int main() {
double i;
double c = 0;
double bsf;
double ssf;
while (cin >> i) {
if (c == 0) {
bsf = i;
cout <<"The largest so far: " << i<<endl;
}
if (c == 1 && i > bsf) {
ssf = bsf;
bsf = i;
cout << "The largest so far: " << i<<endl;
} else if (c > 0 && i > bsf) {
bsf = i;
cout <<"The largest so far: " << i<<endl;
} else if (c > 0 && i < bsf) {
if (i < ssf) {
ssf = i;
cout <<"The smallest so far: " << i <<endl;
}
}
c++;
}
}
在CodeBlocks中,这个程序正常工作(我希望程序允许我插入尽可能多的数字,并在我写出最大数字时指定我,还有最小数字(你可以从中做出更好的想法)当我尝试定义一个字符串时出现问题:
string um;
如果我这样做,程序不会识别写入的最小数字。例如,如果我写第一个数字220,它将被打印&#34;到目前为止最大:220&#34;,但是如果我在45之后写,它将不打印&#34;最小到目前为止:45&#34;。 如果你们能给我一些建议,那就太好了。
谢谢!
答案 0 :(得分:2)
在你的程序中,你试图使用局部变量:
double bsf; // uninitialized local variable
double ssf; // uninitialized local variable
没有初始化它们因此导致undefined behaviour。在使用之前初始化(本地)变量:
double bsf = 0;
double ssf = 0;
实际的罪魁祸首是26
:
if (i < ssf) // UB access to uninitialized variable `ssf`
以下是Visual Studio的屏幕截图,其中包含重要信息:
程序中没有std::string变量。如果有的话,您需要包含<string>
标题。
答案 1 :(得分:2)
就我所见,答案并非未定义的行为。但完全没有满足OP要求的if子句。当输入第二个no时,c
等于1,而在if子句中没有i <= bsf
的代码。所以代码必须重写为
#include <iostream>
using namespace std;
int main() {
double i;
double c = 0;
double bsf;
double ssf;
while (cin >> i) {
if (c == 0) {
bsf = i;
cout <<"The largest so far: " << i <<endl;
}
if (c == 1 && i > bsf) {
ssf = bsf;
bsf = i;
cout <<"The largest so far: " << i <<endl;
} else if(c == 1 && i <= bsf) {
ssf = i;
cout <<"The smallest so far: " << i <<endl;
} else if (c > 0 && i > bsf) {
bsf = i;
cout <<"The largest so far: " <<i <<endl;
} else if (c > 0 && i < bsf) {
if (i < ssf) {
ssf = i;
cout << "The smallest so far: " << i <<endl;
}
}
c++;
}
}
这也将在@Ron的回答中遏制UB
编辑:谢谢@drescherjm我忘记添加&lt; =,已经更正了
答案 2 :(得分:1)
考虑初始值;如果您将bsf
初始化为DBL_MIN
并将ssf
初始化为DBL_MAX
,则此代码会变得更加简单。然后,当您完成循环时,您只需检查bsf
和ssf
的新值,而不会出现涉及c
的所有混淆。