Есть ли способ получить все виды типов данных?

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
0
задан Cykapath 17 January 2019 в 10:25
поделиться

2 ответа

Меня попросили написать код, который получает тип данных, не уточняя, какой тип (например, int, float, double ect ..) и, конечно же, его число.

Так, как я могу использовать все типы данных?

Вы не можете. Точнее говоря, сам процессор не может. Чтобы сравнить 2 числа, ЦП должен знать, какой размер у чисел, если числа целочисленные или с плавающей запятой, и (если это не просто сравнение на равенство), если число подписано или нет.

Есть 3 способа:

a) Дублирование кода (включая шаблоны в C ++, где компилятор автоматически генерирует N версий кода для N типов и использование макросов в C для аналогичного выполнения). [ 1112]

b) Поддерживать только самый большой тип (например, может быть double в C) и преобразовывать все в самый большой тип, так что вам нужна только одна функция для одного типа.

c) злоупотреблять переменными аргументами и иметь ветви времени выполнения, основанные на аргументе «что это за тип» (и повышенный риск ошибок программиста); как int findselectnum(char *data_type, int size, ...). В основном это заканчивается скрытым дублированием кода (например, вы дублируете цикл в каждом case из switch(data_type)).

В зависимости от реальной ситуации; Я бы использовал смесь первых двух вариантов - например, выясните, почему программное обеспечение было так плохо спроектировано, что оно должно выполнять одну и ту же работу с несколькими различными типами, а затем попытайтесь изменить дизайн, чтобы ему нужно было заботиться только о небольшом количестве различных типов; затем иметь небольшое количество различных функций для типов, которые «неизбежно необходимы» (например, может быть int findselectnum_int(int num, int array[], int size) и отдельный int findselectnum_double(double num, double array[], int size); ничего не для float или short или чего-либо еще, потому что их можно было избежать). [ 1115]

0
ответ дан Brendan 17 January 2019 в 10:25
поделиться

Вы можете использовать тип void * вместо типа int [].

Этот тип используется функцией memcpy (), поэтому он может копировать данные любого типа.

Затем вы должны привести свой аргумент void *, чтобы сравнить его с переменной нужного вам типа.

Лично я бы не использовал C для выполнения такого рода задач.

C ++, возможно, немного более уместен, поскольку изначально обрабатывает такие механизмы (шаблоны): https://en.wikipedia.org/wiki/Template_ (C% 2B% 2B)

0
ответ дан Bastien 17 January 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: