[英]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.