LINUX.ORG.RU

Си


2

4
#include <stdlib.h>
#include <stdio.h> 

int main(int argc, char *argv[]) {

char *num = «5555»; 	
	
	if (argc != 2) {
	printf(«No param\n»);
		exit(0);
	}
	
	if (argv[1] != num) {
	printf(«Fail num %s\n»,num);
	printf(«Fail arg %s\n»,argv[1]);
		exit(0);
	}

...
}

Подскажите, почему сравниваются два одинаковых значения, но определяются, как - неодинаковые!

Вывод программы:

Fail num 5555
Fail arg 5555

Ответ на: комментарий от beastie

Да именно это, но я так и не понял будит ли это. В рассылке вроде такое предложение уже было, но его на корню спилили, как я понял. :(

В смысле? o_O' Это давно есть и работает.

korvin_ ★★★★★
()
Ответ на: комментарий от Kiborg

Для подобных извращений можно использовать спец. символы HTML. Или картинку воткнуть.

Но нужны они на самом деле так редко, что можно сказать, что не нужны вовсе!

Anon
()
Ответ на: комментарий от emulek

Ну, здрассти! А как мне память выделять для строки?

И вообще, как парсить текст, если ты не знаешь заранее, сколько места займет N букв?

Нафиг, жрите это Г сами!

Anon
()
Ответ на: комментарий от Anon

А как мне память выделять для строки?
И вообще, как парсить текст, если ты не знаешь заранее, сколько места займет N букв?

ты ведь не написал ни одного серьезного парсера, да?

wota ★★
()
Ответ на: комментарий от geekless

не трогай басик,

у мя 1 практический язык был (для избегания приминимости известной фразы пр первый язык скажу , что в библиотеке(городской) были книжки по алголу/фортрану/лиспу - так шта)

вообще указатели следует(начинающим) курить как обобщение(у нас память этот массив) индексов массива , а не как совсем независимые сущьности

в си мне вот этот пример очень нравится 0[a+i][a+j] - использование массива(плоского) для «динамической» структуры данных (для простоты когда элемент массива и индекс «однотипны»

qulinxao ★★☆
()
Ответ на: комментарий от Miguel

Предлагаешь кэшировать всё?

Предлагаю не сношать мозги неадекватным поведением.

А если в типичных юзкейсах такое вот некрасивое поведение приносит ощутимый практический профит? Типичный int это счетчик или размер массива каких-то структур же. Скорее всего, отношение интов меньше 100 к интам больше 100 примерно соответствует 80:20 или даже 90:10. Я конечно понимаю что в хаскеле всякие счетчики существуют только неявно. Но жаба - императивный язык.

Absurd ★★★
()
Ответ на: комментарий от Anon

Ну, здрассти! А как мне память выделять для строки?

И вообще, как парсить текст, если ты не знаешь заранее, сколько места займет N букв?

man 3 realloc (обычно сделанный руками в собственном мемори-пуле, а не буквально realloc()) google://UTF-8 ASCII compatibility

ilammy ★★★
()
Ответ на: комментарий от anonymous

Операторы в жаве нельзя перегрузить или переписать. Поэтому, блджад, == в жаве всегда ведёт себя одинаково, в отличии от этих ваших плюсов и шарпов.

есть еще оператор + ;)

wota ★★
()
Ответ на: комментарий от anonymous

420 == 420, но new Integer(420) != new Integer(420) или в сях a == b, но &a != &b или в реале близнецы одинаковые на вид, но тем не менее 2 разных человека Как только ты это осознаешь, оно не будет казаться тебе маразмом.

Ещё раз для тупых. Каждая половина сама по себе терпима. Можно понять, когда число всегда равно самому себе. Можно, в принципе, понять, когда оно всегда не равно самому себе. Ситуация, когда число может быть равно себе, а может — нет, идиотская.

Ну и инициализация делается не new Integer(420), а просто 420. Это добавляет неестественности.

Miguel ★★★★★
()
Ответ на: комментарий от PolarFox

Для начала тебе нужно узнать, чем int отличается от Integer.

Ещё один идиот. Почитай тред.

Miguel ★★★★★
()
Ответ на: комментарий от Anon

Только CGI-библиотечку для работы с POST/GET, куками и т.п.

сомневаюсь, что ты и ее писал, а не сделал hello world, так как, если б ты писал что-то серьезное, то знал бы про то, что там тоже символы не обязательно однобайтовые

wota ★★
()
Ответ на: комментарий от wota

символы не обязательно однобайтовые

надеюсь, что ты догадаешься о чем идет речь

wota ★★
()
Ответ на: комментарий от anonymous

Мигель, очевидно, прав и ничего не спутал. Попытки обставить ситуацию как-то по-другому тщетны.

anonymous
()
Ответ на: комментарий от anonymous

Абстракции у тебя в голове. Не позволяй им течь.

Чувак, object identity — та самая абстракция, которая протекла. Мигель или Хвостострел тут совершенно правы, а вот Песец и некоторые аноны упорно не хотят признавать косяк милой сердцу жабки.

anonymous
()
Ответ на: комментарий от Miguel

Типичный int это счетчик или размер массива

И при чём тут int?

int это тип который заворачивается в Integer при боксинге.

Absurd ★★★
()
Ответ на: комментарий от PolarFox

замечательная популяризация.

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

«эта презинтация» лучше позволяет понять Ч.Мура(автора форта) с его манией «1000» cpu on chip; Алана Кея(...) с его манией впихнём привычное пользовательское окружение в 20KLOC ; Вирта с его стремлением , что бы любая кухарка могла управлять государством могла обозреть всю систему линукс программную.

зы. однако задача коммуникации(на том же примере киральности) в общем не разрешима.

qulinxao ★★☆
()
Ответ на: комментарий от PolarFox

кстати во что превратились блок схемы(из видио) в стремлении на бумаге их рисовать в ручную - это же отличный пример карго культа

и тот же карго культ с опусканием реально крутых Actor'ов в «ооп»-однопоточного всеведующего cpu

qulinxao ★★☆
()
Ответ на: комментарий от PolarFox

однако текст как формула должна быть основой ибо редактируемость.

qulinxao ★★☆
()

Если С-компилятор способен на string pooling и сравнение производится const-объектов в пределах одного модуля - сравнивать можно, но в данном случае argv[] указывает на область динамической памяти, модифицируемой во время выполнения, т.е. сравнивать нельзя

frame ★★★
()
Ответ на: комментарий от anonymous

спасибо .

в первую очередь тем кто коммутативный + перегрузил(«подгрузил») не коммутативной конкатенацией строк.

qulinxao ★★☆
()
Ответ на: комментарий от Miguel

практические причины почему кэшируется при настройках по умолчанию только байторазмерные значения(0..255) вполне «можно понять и простить»

ибо для счёта части достаточно 0, 1, много .

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

есть всё таки некоторое исскуственное затруднение что в зависимости от значения обьекта(числа) разная семантика для литералов обьект-число.

т.е платой за кеширование начальных значений есть усложнение семантики всего языка - вполне себе понятный трэйдофф - который и повышает ценность всяким Кобол-программистам знающим все нюансы своего кобола при очередной проблеме 2000

qulinxao ★★☆
()
Ответ на: комментарий от Anon

Ну, здрассти! А как мне память выделять для строки? И вообще, как парсить текст, если ты не знаешь заранее, сколько места займет N букв?

дык попробуй strlen(3), оно РАБОТАЕТ.

emulek
()
Ответ на: комментарий от emulek

strlen в юникоде? O_o

Там же занимаемый строкой объем памяти вообще никак не связан с длиной строки в символах!

Anon
()
Ответ на: комментарий от Miguel

Ещё раз для тупых. Каждая половина сама по себе терпима. Можно понять, когда число всегда равно самому себе. Можно, в принципе, понять, когда оно всегда не равно самому себе. Ситуация, когда число может быть равно себе, а может — нет, идиотская.

не всё так просто. Ситуация, когда число может быть равно себе, а может быть и не равно — вполне нормальна и логична. Хотя ремесленникам и пролетариям это конечно недоступно.

emulek
()
Ответ на: комментарий от Miguel

а при чём тут вообще твоя сраная жаба? Иди вари борщ и пиши тонны говнокода.

emulek
()
Ответ на: комментарий от Anon

А зачем тебе знать длину строки в символах при выделении памяти? Ты у системы символы запрашиваешь или байты?

Gvidon ★★★★
()
Ответ на: комментарий от Anon

strlen в юникоде? O_o

да.

Там же занимаемый строкой объем памяти вообще никак не связан с длиной строки в символах!

дык ты же про выделение памяти спрашивал? Вот какая разница(для выделения памяти), сколько символов в слове «жопа»? Это 8(восемь) байт.

emulek
()
Ответ на: комментарий от anonymous

Потому, что генетический мусор победил количеством в последней мировой.

Так и до быдло-it/псевдо-cs товарищ сталин дотянулся когтистой лапой? // btw вы слишком поторопились, сей рубеж уже вряд ли сдадут

anonymous
()
Ответ на: комментарий от nerdogeek

wchar_t бесполезен. Точнее, не решает той проблемы, которую по идее призван решать (не хранить вместе со строкой её кодировку).

Длина строки в байтах, длина строки в code points, длина строки в code units, длина строки в символах и длина строки в пикселях на девайсе — это всё совершенно различные вещи.

ilammy ★★★
()
Ответ на: комментарий от Miguel

int это тип который заворачивается в Integer при боксинге.

Замечательно. Так при чём он тут?

Переменные типа Integer получаются из переменных типа int, и, следовательно, в подавляющем большинстве кейсов содержат в себе те же значения что и типичный int. А типичный int содержит в себе значения от 0 до ~100. Вероятно, разработчики JVM проводили соответствующие перформанс тесты на типичных кейсах и имели более точную картину.

Absurd ★★★
()
Последнее исправление: Absurd (всего исправлений: 2)
Ответ на: комментарий от wota

А как правильно? Везде wchar_t* и подразумевать, что там UTF-16/UTF-32? Чем это (концептуально) лучше char* и подразумеваемой UTF-8?

Я повторю: один UTF-32 code point — это не обязательно один символ. Важно понимать, что строку можно понимать как 1) кусок байтов в памяти, 2) символы с каким-то смыслом. Для первого варианта абсолютно не важно, там wchar_t, char или хоть long double. Для второго необходимо знать кодировку, локаль, правила нормализации, шрифт или бог знает что ещё, что там понадобится для использования этой строки.

ilammy ★★★
()
Ответ на: комментарий от ilammy

А как правильно? Везде wchar_t* и подразумевать, что там UTF-16/UTF-32? Чем это (концептуально) лучше char* и подразумеваемой UTF-8?

а не надо ничего подразумевать

повторю: один UTF-32 code point — это не обязательно один символ

по стандарту wchar_t обязан вмещать любой символ

Для второго необходимо знать кодировку, локаль, правила нормализации, шрифт или бог знает что ещё, что там понадобится для использования этой строки.

для валидного wchar_t нормализация не нужна по определению, локаль - да, и хоть такое понятие и есть в ЯП, но для надежности приходится использовать icu (к счастью разработчиков компиляторов и авторов стандарта), а шрифты это уже совсем отдельная история

wota ★★
()
Ответ на: комментарий от Deleted

да, нуль-кодач тут в полном составе. Вопрос в том, что ты сделаешь с этим знанием

stevejobs ★★★★☆
()
Ответ на: комментарий от ilammy

и да, я понимаю - мир несовершенен, где-то (не будем показывать пальцем) вообще используют UCS-2, но на практике в 99.999% случаев wchar_t просто работает

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от Miguel

Ещё раз для тупых. Каждая половина сама по себе терпима. Можно понять, когда число всегда равно самому себе. Можно, в принципе, понять, когда оно всегда не равно самому себе. Ситуация, когда число может быть равно себе, а может — нет, идиотская.

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

В жаве есть два типа данных, которые ты упорно путаешь: это int и Integer. int всегда обозначает число, одно из тех самых чисел, о которых ты пытаешься рассуждать. Integer обозначает коробку с числом. Отсюда слово «boxing».

Число 420 в жаве всегда равно числу 420. Коробка с числом 420 в жаве равна самой себе, но не равна другой коробке с тем же числом. Потому что это две коробки, а не одна и та же.

tl;dr: Ты сравниваешь числа через задницу и обвиняешь разработчиков жавы, что у тебя ничего не получается. С тем же успехом ты можешь убиться об стену и обвинить строителей, что они дверь на метр правее поставили.

anonymous
()
Ответ на: комментарий от anonymous

которые ты упорно путаешь: это int и Integer

Нет. Я, как раз, постоянно их разграничиваю.

Коробка с числом 420 в жаве равна самой себе, но не равна другой коробке с тем же числом.

Ещё раз: это, в принципе, можно понять и принять. До тех пор, пока эта логика не рушится с треском на числе 42.

Ты сравниваешь числа через задницу и обвиняешь разработчиков жавы, что у тебя ничего не получается.

Я обвиняю разработчиков жабы в том, что они сделали поведение Integer-ов неестественным (это бы ещё ладно) и несогласованным (а вот это уже криминал).

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

С тем же успехом ты можешь убиться об стену и обвинить строителей жавы, что они дверь на метр выше пола поставили.

Пофиксил.

geekless ★★
()
Ответ на: комментарий от Miguel

Ситуация, когда число может быть равно себе, а может — нет, идиотская.

Мы живем в идиотском мире, т.к на наших компьютерах выполняется условие 1e20 + 1 == 1e20, например.

Absurd ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.