C++ C++;而循环未从我的文件中读取-1

C++ C++;而循环未从我的文件中读取-1,c++,loops,while-loop,C++,Loops,While Loop,我正在编写一个程序,从.txt文件中读取数字,并输出相应数量的星号(对于偶数整数)和美元符号(对于奇数整数)。例如,3将输出$$,2将输出**。程序工作正常,但读取数字-1时除外。除-1外,其他负数也可以正常工作 这是我的密码: #include <iostream> #include <fstream> #include <string> #include <iomanip> #include <Windows.h> using n

我正在编写一个程序,从.txt文件中读取数字,并输出相应数量的星号(对于偶数整数)和美元符号(对于奇数整数)。例如,3将输出$$,2将输出**。程序工作正常,但读取数字-1时除外。除-1外,其他负数也可以正常工作

这是我的密码:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <Windows.h>

using namespace std;

int main()
{
int value, even, odd;
ifstream infile;
infile.open("lab6_input.txt");

while (infile >> value)
{
    if (value % 2 == 0)
        cout << string(abs(value), "*$"[value % 2]) << endl;
    else
        cout << string(abs(value), "*$"[value % 2]) << endl;
    value++;
}
infile.close();

system("pause");
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
int值、偶数、奇数;
河流充填;
infle.open(“lab6_input.txt”);
而(填充>>值)
{
如果(值%2==0)

cout您的代码似乎有点奇怪。您的变量未初始化,偶数和奇数未使用偶数。您的if语句是不必要的,因为在这两种情况下,您都有相同的代码

关于你的问题: 您应该使用
abs(value)
两次。 试一试

while(填充>>值){
问题就在这里

"*$"[value % 2]
在C++中,应用于负数的模算符的结果是否定的(技术上是这样的)。因此,当<代码>值<代码>为负时,该指令会导致未定义的行为,访问数组(字符串文字)超出界限(索引<强> -1 < /强>)。

你可以用<代码>值>代码>或结果的绝对值来解决这个问题,但是考虑写一个像下面这样的自由函数。

constexpr bool is_odd(int x)
{
    return x % 2;
}
它将更好地表达意图,并有助于编译器优化代码(参见示例),因为这就像你在问

告诉我
是否可被2整除(其被2整除的余数为零)

这与

值的剩余部分除以2


您可能已经注意到,在链接的编译器资源管理器页面中,编译器最终使用了一个简单的

and     edi, 1
这是因为你真正需要的是不太重要的位,你可以直接在你的代码中使用

value & 1
但是请注意,标准(我正在编写的C++17)并没有规定(C++20需要两个补码)类型
int
的特定二进制表示形式,因此前面的实现将是定义的(如果您碰巧发现仍在工作的
int
实现,则是错误的)

value & 1