#c
#c
Вопрос:
Я не понимаю, почему следующий фрагмент кода выдаст мне ошибку компиляции:
string a = NULL:
if (a == NULL) <<<<<<<<<<<<<<<<<< something is wrong with this line????
{ /* do something */ }
Это дает :
error: no match for ‘operator!=’ in ‘a != 0l’
Комментарии:
1. Какую часть сообщения об ошибке вы не понимаете?
2. Должно ли быть двоеточие после первого NULL? Эта ошибка возникла из этого кода или из какого-то другого кода? Вы не используете !=, вы используете ==.
3.
string a = NULL
является UB дляstd::string
.4. Что
aStr
? Чтоnull
? Почему вы не показываете нам фактический код, выдающий вам эту ошибку?5. Хорошо, вот в чем дело. Я не понимаю причину отрицательных голосов! Я задал вопрос, потому что я действительно не понимал, почему он получал ошибку компиляции. Что в этом плохого?
Ответ №1:
if (a == NULL)
не может работать, так как вы сравниваете std::string
с целым числом, что невозможно. если вы хотите создать пустую строку и проверить ее на пустоту, просто сделайте:
string a;
if (a.empty())
{ /* do something */ }
Комментарии:
1. НЕ приведет ли это к некоторой ошибке из-за не инициализированной переменной ИЛИ выброса NPE? (Извините, я из Java-среды)
2. @One Two Three: Нет,
string a;
вызывает конструктор по умолчанию,string
который инициализируетсяa
как пустая строка.
Ответ №2:
string
в C это не то же самое, что строка в C. Вам нужно будет сравнить строку со строкой как a == string ("")
.
Комментарии:
1. в c std::string перегружен operator==, поэтому приведение не требуется.
2.
std::string
также реализуетempty()
, поэтому все==
не требуется.3. Любой, если вы использовали == (что нормально для удобства чтения для некоторых людей), вам нужно только
a == ""
Ответ №3:
Просто взглянув на это, двоеточие в конце первой строки вместо точки с запятой определенно бросит туда ключ. Не уверен, что это так, но я бы начал с этого.
Ответ №4:
Просто инициализируйте пустую строку с двойными кавычками и проверьте, является ли строка пустой. Или для вас обязательно использовать NULL?
string a = "";
if (a == "")
{ /* dosomething */ }