В C главное не должно быть функцией?

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

13
задан Gowtham 12 February 2010 в 14:23
поделиться

8 ответов

Случай 1. специфичен для Windows - компилятор, вероятно, генерирует символ _WinMain , если main определен правильно.

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

5
ответ дан 1 December 2019 в 17:47
поделиться

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

Тип возвращаемого значения main () должен быть int (не void ). Если компоновщик ищет WinMain , он думает, что у вас есть приложение с графическим интерфейсом.

30
ответ дан 1 December 2019 в 17:47
поделиться

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

Сообщение _WinMain связано с тем, как работают программы Windows. Ниже уровня среды выполнения C исполняемый файл Windows имеет WinMain.

2
ответ дан 1 December 2019 в 17:47
поделиться

В большинстве систем компиляции C нет информации о типе, связанной со связанными символами. Вы можете объявить main как, например, следующим образом: [

char main[10];

], и компоновщик будет полностью счастлив. Как вы заметили, программа, вероятно, выйдет из строя, если вы не инициализируете содержимое массива с умом.

Ваш первый пример не определяет main, он просто объявляет его, отсюда и ошибка компоновщика.

Второй пример определяет main, но неверно.

6
ответ дан 1 December 2019 в 17:47
поделиться

Попробуйте переопределить его как int main (int argc, char * argv [])

У вас есть ошибка компоновщика. Компоновщик ожидает найти функцию с этой "подписью" - не пустую без параметров

См. http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html и т. Д.

]
1
ответ дан 1 December 2019 в 17:47
поделиться

В листинге 1 вы говорите: «В моем коде есть функция main (), я обещаю!». Вот почему он компилируется. Но вы там лежите, поэтому ссылка не работает. Причина отсутствия ошибки WinMain16 заключается в том, что стандартные библиотеки (для компилятора Microsoft) содержат определение для main (), которое вызывает WinMain (). В программе Win32 вы должны определить WinMain (), а компоновщик будет использовать библиотечную версию main () для вызова WinMain ().

В листинге 2 у вас определен символ с именем main, поэтому и компилятор, и компоновщик счастливы, но код запуска попытается вызвать функцию, которая находится в местоположении «main», и обнаружит, что на самом деле функции нет. там и крах.

0
ответ дан 1 December 2019 в 17:47
поделиться

1.) Перед выполнением кода в main вызывается (компилятор/платформа) зависимая функция и, следовательно, ваше поведение(_init в случае linux/glibc).
2) Сбой кода во втором случае оправдан, так как система не может получить доступ к содержимому символа main как к функции, которая на самом деле является указателем функции, указывающим на произвольное местоположение.

0
ответ дан 1 December 2019 в 17:47
поделиться

На платформах Windows основным блоком программы является WinMain, если вы не настроили программу как консольное приложение. «@ 16» означает, что ожидается 16 байтов параметров. Таким образом, компоновщик будет вполне доволен вами, если вы предоставите ему функцию WinMain с 16 байтами параметров.

Если вы хотели консольное приложение, это означает, что вы что-то напутали.

3
ответ дан 1 December 2019 в 17:47
поделиться
Другие вопросы по тегам:

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