我是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;
}
当我编译并运行时,我没有得到最大的数字也没有公共因子。
答案 0 :(得分:1)
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;
这通常是您在写入控制台窗口时所需的行为(但是在写入文件时可能不会这样,每一行刷新缓冲区都会造成不必要的代价,并且因为您没有按原样读取文件&# 39;写作可能不值得。)
现在,有一些细微差别,在某些实现中,总是刷新到终端的输出。 Cin与cout绑定(可能只有在C ++ 11之后?)因此当你调用cin时cout被刷新,所以你没有空白的输入提示(所以你的第一组cout / cins会被覆盖那个)。但是,如果不自己动手(通常使用endl),技术上并不能保证您的消息会在您需要时显示在控制台上。
下一步:for和if块在结束括号后不需要分号。在这个特定的例子中,他们不会伤害任何东西(他们只是空洞的陈述,就像分号一样只能在一条线上),但这是一个坏习惯。当你看到你期望看到像括号括起的初始化列表,或类或对象定义。
最后,你使用
using namespace std;
但仍完全符合所有名称。从技术上讲,这不是错误,但请再次确保您了解using语句的作用。它实际上经常被认为是好,因为你习惯于在std命名空间中完全限定名称。我只是说,如果您打算对所有名称进行限定,那么就不要在命名空间中转储。