сравнение подписанного с неподписанным int - PullRequest
0 голосов
/ 06 августа 2020

Я написал следующие строки кода:

int pos = 0, last_pos = 0;
while ((pos = str.find_first_of(" ", last_pos)) != string::npos)

Но компилятор показывает ошибку:

error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
     while ((pos = str.find_first_of(" ", last_pos)) != string::npos)
                                                                            ^

Как я могу это исправить? Я впервые вижу это

1 Ответ

5 голосов
/ 06 августа 2020

Похоже, кто-то поднял уровень предупреждений в ваших инструментах и ​​превратил предупреждения в серьезные ошибки, приводящие к остановке компиляции. Это хорошо в большинстве случаев, особенно во время обучения, потому что вы больше не можете игнорировать предупреждения компилятора 1 .

Информация о позиции и размере, возвращаемая методами string, беззнаковая. . В конце концов, какой смысл в строке отрицательной длины? Если вы посмотрите документацию для find_first_of, вы увидите, что он не возвращает int; он возвращает size_type. С помощью чуть больше вы обнаружите, что size_type - это целое число без знака того или иного типа, определенного реализацией библиотеки вашего инструмента разработки. Если вы go покопаетесь в заголовках реализации стандартной библиотеки, вы найдете фактический тип, представленный size_type, но вам не нужно знать точный тип. Просто используйте size_type и позвольте компилятору выяснить детали.

Итак ...

int pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)

должно быть

string::size_type pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)

1 Ошибки компилятора - это неверный синтаксис, плохая грамматика, из-за которых исходный код невозможно преобразовать в исполняемый код. Предупреждения компилятора - это синтаксически правильный код, но компилятор обеспокоен тем, что могут быть сомнительные logi c и программа не будет вести себя так, как вы ожидаете. Часто это правильно, и изучение предупреждения сэкономит вам время на отладку ошибки во время выполнения. Но иногда это предупреждение о том, с чем вы вряд ли столкнетесь. В этом конкретном случае вам потребуется ОГРОМНАЯ строка, вероятно, длиной в гигабайты, чтобы появилась ошибка logi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...