簡體   English   中英

有符號和無符號整數表達式的比較

[英]Comparison between signed and unsigned integer expressions

我剛開始使用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();
}

我得到的錯誤是:警告:有符號和無符號整數表達式之間的比較(第 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();
}

這段代碼工作得很好。 為什么第一個代碼不能正常工作?

編輯:跟進賽博的回答,我將循環改為:

for (unsigned int i = 0; i < sizeof(message) / sizeof(message[0]); i++)

但是OpenGL代碼並沒有像預期的那樣顯示“你好,世界!” 窗口中的消息。 它只是創建了一個窗口,上面寫着“OpenGL hello 程序”,沒有別的。

這條線就是問題所在

for (int i = 0; i < sizeof(message) / sizeof(message[0]); i++)

運算符sizeof的返回類型為std::size_t ,因此您應該將其用於變量i的類型。 std::size_t是無符號類型,因此編譯器警告您將有符號類型( int )與無符號類型進行比較,因為如果一個變量的值不在可表示的范圍內,則比較可能是不安全的。另一種。

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

或者只是使用基於范圍的for循環。

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

For (int i =0,i<sizeof ....) 那一行是問題所在。 sizeof 函數返回一個無符號整數,因此與有符號整數相比會導致錯誤。 嘗試為 sizeof 創建一個 int 變量,像這樣 Int size=sizeof()... 然后在你的行中替換如下 For (int i=0,i<size...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM