==
сравнивает ссылки на объекты.
.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()
всегда лучше.
Случай 1. специфичен для Windows - компилятор, вероятно, генерирует символ _WinMain
, если main
определен правильно.
Случай 2. - у вас есть указатель, но как статическая переменная он инициализирован нулем , поэтому происходит сбой.
Верно, main
не должна быть функцией. Это использовалось в некоторых запутанных программах, которые содержат двоичный программный код в массиве с именем main
.
Тип возвращаемого значения main () должен быть int
(не void
). Если компоновщик ищет WinMain
, он думает, что у вас есть приложение с графическим интерфейсом.
Вы объявили указатель на функцию с именем main, и компоновщик предупредил вас, что это не сработает.
Сообщение _WinMain связано с тем, как работают программы Windows. Ниже уровня среды выполнения C исполняемый файл Windows имеет WinMain.
В большинстве систем компиляции C нет информации о типе, связанной со связанными символами. Вы можете объявить main как, например, следующим образом: [
char main[10];
], и компоновщик будет полностью счастлив. Как вы заметили, программа, вероятно, выйдет из строя, если вы не инициализируете содержимое массива с умом.
Ваш первый пример не определяет main, он просто объявляет его, отсюда и ошибка компоновщика.
Второй пример определяет main, но неверно.
Попробуйте переопределить его как int main (int argc, char * argv [])
У вас есть ошибка компоновщика. Компоновщик ожидает найти функцию с этой "подписью" - не пустую без параметров
См. http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html и т. Д.
]В листинге 1 вы говорите: «В моем коде есть функция main (), я обещаю!». Вот почему он компилируется. Но вы там лежите, поэтому ссылка не работает. Причина отсутствия ошибки WinMain16 заключается в том, что стандартные библиотеки (для компилятора Microsoft) содержат определение для main (), которое вызывает WinMain (). В программе Win32 вы должны определить WinMain (), а компоновщик будет использовать библиотечную версию main () для вызова WinMain ().
В листинге 2 у вас определен символ с именем main, поэтому и компилятор, и компоновщик счастливы, но код запуска попытается вызвать функцию, которая находится в местоположении «main», и обнаружит, что на самом деле функции нет. там и крах.
1.) Перед выполнением кода в main вызывается (компилятор/платформа) зависимая функция и, следовательно, ваше поведение(_init
в случае linux/glibc).
2) Сбой кода во втором случае оправдан, так как система не может получить доступ к содержимому символа main
как к функции, которая на самом деле является указателем функции, указывающим на произвольное местоположение.
На платформах Windows основным блоком программы является WinMain, если вы не настроили программу как консольное приложение. «@ 16» означает, что ожидается 16 байтов параметров. Таким образом, компоновщик будет вполне доволен вами, если вы предоставите ему функцию WinMain с 16 байтами параметров.
Если вы хотели консольное приложение, это означает, что вы что-то напутали.