Могу ли я использовать условный оператор для инициализации строкового литерала в стиле C? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь использовать тернарный оператор (?:) для инициализации массива символов либо одной строкой, либо другой

char answ[] = ans > 0 ? "Anton" : "Danik";

Где ans - это просто целое число, полученное ранее, и я сохраняю получение ошибки:

initialization with '{...}' expected for aggregate object

Это что вы просто не можете инициализировать массивы с помощью тернарного оператора?

Тоже пробовал:

char answ[] = { ans>0 ? "Anton" : "Danik" };

Что выдало ошибку:

value of type "const char *" cannot be used to initialize an entity of type "char"

1 Ответ

2 голосов
/ 14 июля 2020

Неужели вы просто не можете инициализировать массивы с помощью тернарного оператора?

В самом деле, вы не можете.

В вашем примере вы не Я не хочу иметь только массив. Вам нужен строковый литерал - массив спецификаций c. К сожалению, компилятор не рассматривает answ как единое целое, потому что вы пытаетесь использовать условный оператор для инициализации. Компилятор рассматривает его напрямую как массив char s.

Но есть другой метод объявления C строк - с использованием const и указателя.

const char* answ = ans > 0 ? "Anton" : "Danik";

Обратная сторона этого подход такой, ну, ну, const - вы не можете изменить эту строку.

Вот почему, если вы используете C ++, вы должны использовать его строки - std::string:

std::string answ = ans > 0 ? "Anton" : "Danik";

В C вы могли бы сделать:

char answ[6];
ans > 0 ? strcpy(answ, "Anton") : strcpy(answ, "Danik");

Но на данный момент тернарный оператор просто менее подробен, чем обычный if-else , поэтому не делайте этого .

...