Может ли std :: cout печатать «NULL» вместо 0 при печати нулевого указателя? - PullRequest
0 голосов
/ 29 октября 2019

Может std::cout печатать " NULL " вместо 0 при печати нулевого указателя ?? Я могу написать простое выражение if, например

if(pointer == nullptr)
  std::cout << "NULL";

Но могу ли я получить тот же результат без использования оператора if?

Ответы [ 3 ]

4 голосов
/ 29 октября 2019

Вы не можете по-настоящему избежать использования оператора if, но вы можете превратить его в однострочный с помощью троичного оператора: (p == NULL ? std::cout << "NULL" : std::cout << p);

#include <iostream>

int main() {
  void *p = NULL;
  (p == NULL ? std::cout << "NULL" : std::cout << p);
  std::cout << std::endl;

  p = new int;
  (p == NULL ? std::cout << "NULL" : std::cout << p);
  std::cout << std::endl;
}

Демо

3 голосов
/ 29 октября 2019

Я могу придумать 2 способа.

1) Четкий путь: использовать троичный оператор (?:)

    cout<<((ptr)?"":"NULL\n");

2) Гадкий путь, если вы действительно этого не делаетехотите использовать любые условные операторы.

    cout<<&("NULL"[4*(!!ptr)]);

Почему это работает?

!! ptr установит значение ptr в 0 или 1 в зависимости от его значения.

Если это значение равно null, cout увидит символ *, начинающийся с индекса 0, и выведет «NULL», в противном случае он увидит его из индекса 4 и напечатает завершающий символ.

Этоочень плохой способ, поскольку nullptr может быть определен реализацией и может быть не переносимым.

3 голосов
/ 29 октября 2019

Вы можете использовать троичный оператор, ?.

pointer ? std::cout << pointer : std::cout << "NULL";

или с расширением компилятора gnu c ++ IF ваш указатель является char*

std::cout << (pointer ?: "NULL");

при условии, что второй способ не будет работать на всех компиляторахпотому что это официально не является частью языка.

Я не верю, что существует эквивалент std::boolalpha для указателей.

[EDIT]

Как указывает @ seleciii44, в сообщении о переполнении стека здесь вы можете написать свой собственный оператор вставки перегруженного потока

std::ostream & operator<<(std::ostream &s, std::nullptr_t)
{
    return s << "nullptr";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...