程序未输出变量

Program not outputting variable

本文关键字:变量 输出 未输 程序      更新时间:2023-10-16

我是C++的新手,想制作一个简单的程序来查找2个数字之间的公共因子。我正在使用MSYS2进行编译。我的代码编译时没有错误,但是在定义lrg变量后,程序不会输出任何内容这是代码:

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num1;
int num2;
std::cout << "Enter the first number:";
std::cin >> num1;
std::cout << "Enter the second number:";
std::cin >> num2;
int lrg = std::max(num1, num2);
std::cout << "The largest number is " << lrg;
for (int i = 0; i < lrg; i++) {
if (num1 % i == 0 && num2 % i == 0) {
std::cout << i;
};
};
return 0;
}

当我编译和运行时,我既没有得到最大的数字,也没有得到公共因子。

for循环的第一个操作将被0除,在c++x/y或x%y中是未定义的行为

这意味着它几乎可以做任何事情,从莫名其妙的崩溃到莫名其妙的工作,再到介于两者之间的各种事情。在某些环境中,您可能会期望抛出异常,但C++并不能保证这一点,而是实现。

所以你没有正确计算这些因素,这就是主要问题。一些副业:

(感谢John 3136!)在cout语句的末尾使用std::endl可能总是一个好主意,您打算在控制台中立即阅读该语句。当你有这样的声明时:

std::cout << "The largest number is " << lrg;

您正在写入缓冲区,而不是直接写入任何设备(通常在c++std::cout中,您正在写入标准输出,但即使这样也可以重定向)。缓冲区实际发送到设备的时间是由实现定义的,但通常不希望逐字节写入每个字节。你缓冲一些,然后写。这一点很重要,比如说,流式传输到一个可能有大量数据的文件,并且可以节省大量性能。

endl是特殊的,它写入一个换行符,然后刷新流,这意味着它将缓冲区中的所有内容都写入设备。

std::cout << "The largest number is " << lrg << std::endl;

这通常是您在向控制台窗口写入时想要的行为(但可能不是在向文件写入时,每一行刷新缓冲区的成本都不必要,而且由于您在写入文件时没有读取文件,因此可能不值得这样做)。

现在,有一些细微差别,在一些实现中,输出到终端总是刷新的。Cin与cout绑定(可能只是从C++11开始?),因此当您调用Cin时,cout会被刷新,因此您没有空白的输入提示(因此您的第一组cout/Cin将被覆盖)。然而,如果不亲自处理(通常使用endl),从技术上讲,无法保证您的消息会在需要时显示在控制台上。

下一个:for和if块在右括号后不需要分号。在这个特定的例子中,它们不会伤害任何东西(它们只是空语句,就像一行中的分号一样),但这是一个坏习惯。当您看到它时,您希望看到类似于大括号括起来的初始化列表,或者类或对象定义之类的内容。

最后,您使用

using namespace std;

但仍然完全限定所有名称。从技术上讲,这不是一个错误,但请再次确保您理解using语句的作用。实际上,养成在std命名空间中完全限定名称的习惯通常被认为是很好的。我想说,只是出于明确的目的,如果你打算限定所有名称,那么就不要在命名空间中转储。