有符号和无符号整数表达式之间的比较

Bos*_*nia 2 c++ compiler-errors

我刚开始使用OpenGL.这是我的第一个代码:

// OpenGL hello program
#include<iostream>
#include <GL/glut.h>
#include <cstring>

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    char message[] = "Hello, world!";
    glRasterPos2d(0, 0);
    for (int i = 0; i < sizeof(message) / sizeof(message[0]); i++)
    {
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, message[i]);
    }
}

int main(int argc, char *argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(500, 500);
    glutCreateWindow("OpenGL hello program");
    glutDisplayFunc(display);
    glutMainLoop();
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:警告:有符号和无符号整数表达式之间的比较(第9行). 我还尝试编写一个新代码然后看看导致问题的原因:

#include<iostream>
#include <cstring>

void display1() {
    char message[] = "Hello, world!";

    for (int i = 0; i < sizeof(message) / sizeof(message[0]); i++)
        std::cout<<message[i];
}

int main() {
    display1();
}
Run Code Online (Sandbox Code Playgroud)

这段代码非常好用.为什么第一个代码不能正常工作?

编辑: 继续使用Cyber​​的答案,我将循环更改为:

for (unsigned int i = 0; i < sizeof(message) / sizeof(message[0]); i++)
Run Code Online (Sandbox Code Playgroud)

OpenGL代码没有做到预期的即显示"Hello,world!" 窗口中的消息.它只是创建了一个窗口,其中"OpenGL hello program"写在顶部而没有别的.

Cor*_*mer 13

这条线就是问题所在

for (int i = 0; i < sizeof(message) / sizeof(message[0]); i++)
Run Code Online (Sandbox Code Playgroud)

因此,运算符sizeof的返回类型std::size_t应该是变量类型的用途i.std::size_t是无符号类型,因此编译器警告您将有符号类型(int)与无符号类型进行比较,因为如果一个变量的值不在另一个类型的可表示范围内,则比较可能是不安全的.

for (std::size_t i = 0; i < sizeof(message) / sizeof(message[0]); ++i)
Run Code Online (Sandbox Code Playgroud)

或者只是使用基于范围的for循环.

for (auto i : message)
{
    std::cout << i;    // i is a char from the message array
}
Run Code Online (Sandbox Code Playgroud)