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

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

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

Она не рушится. Ты заказывал коробку с числом 42? Пожалуйста, держи. Что, отдельную? Про отдельную ты ничего не говорил. Если непременно хочешь отдельную, так и пиши.

неестественным

4.2

несогласованным

лютое 4.2, ибо всё в документации

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

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

Согласен, но с флоатами другая история: там НЕВОЗМОЖНО сделать хорошо.

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

Пофиксил.

Зачем ты пофиксил рабочий код? Иди тестируй теперь, как ты через эту дверь пойдёшь.

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

Она не рушится. Ты заказывал коробку с числом 42? Пожалуйста, держи. Что, отдельную? Про отдельную ты ничего не говорил. Если непременно хочешь отдельную, так и пиши.

Если твоя «логика» ничего не говорит о том, каков должен быть результат сравнения, то она вообще не имеет отношения к делу.

несогласованным

лютое 4.2, ибо всё в документации

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

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

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

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

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

Если твоя «логика» ничего не говорит о том, каков должен быть результат сравнения, то она вообще не имеет отношения к делу.

Я кому, блджад, в прошлом посте расписывал, каков должен быть результат сравнения?

Выучи разницу между «согласованным» и «документированным», потом приходи.

Ну дефинируй мне «согласованным», раз самый умный. С кем там ещё нужно что-то согласовать, кто остался недоволен?

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

Я кому, блджад, в прошлом посте расписывал, каков должен быть результат сравнения?

Какая разница, если он РАЗНЫЙ?

С кем там ещё нужно что-то согласовать

Внутренняя согласованность. Чтобы, значить, работало в схожих случаях схожим образом.

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

Какая разница, если он РАЗНЫЙ?

А какая разница, разный он или нет, если всё, что тебе нужно сделать, это списать число с коробки? Тебе не пофиг, будет ли это одна и та же коробка или нет, если число одно и то же?

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

А какая разница, разный он или нет,

Такая, что любая твоя «логика» либо ломается на одном из вариантов, либо не говорит ничего о том, что должно получиться.

Тебе не пофиг, будет ли это одна и та же коробка или нет, если число одно и то же?

Мне пофиг, если это будет каждый раз одинаково.

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

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

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

Такая, что любая твоя «логика» либо ломается на одном из вариантов, либо не говорит ничего о том, что должно получиться.

Моя логика говорит, что сравнивая два Integer оператором ==, ты узнаешь один и тот же это объект или нет. Если ты доверяешь создание объектов жавамашине, то и результат будет зависить от жавамашины. А если у тебя бизнеслогика завязана на поведение жавамашины, то ты адский быдлокодер.

Мне пофиг, если это будет каждый раз одинаково.

Оно и будет одинаково, если ты будешь сравнивать не коробки, а числа, которые на них стоят.

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

Моя логика говорит, что сравнивая два Integer оператором ==, ты узнаешь один и тот же это объект или нет. Если ты доверяешь создание объектов жавамашине, то и результат будет зависить от жавамашины.

По-русски это называется «ХЗ». Вот только это не логика.

Оно и будет одинаково, если ты будешь сравнивать не коробки, а числа, которые на них стоят.

Можно проще: вообще не писать на жабе. Толку-то.

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

По-русски это называется «ХЗ».

По русски это называется не «ХЗ», а «иди читать документацию, неуч». Но!

Можно проще: вообще не писать на жабе. Толку-то.

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

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

Несмотря на наш идиотский мир мы можем выбрать небоксированный тип данных под те задачи где он не нужен.

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

Нет, именно так. То ли будет true. То ли false. А фиг его знает.

Не фиг его знает, а стоит в документации. Более того, настраивается. Но ты же не осилил.

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

Фигушки! От кодировки зависит!!!

Нет кодировок, кроме C, UTF-8 и UCS-2, причем в первой нет буквы «ф», а последняя нужна только для внутреннего представления строковых данных.

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

чтоб получить true сравнивать надо с 1L, да - Java очень очевидный ЯП :)

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

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

В документации нету, да. Может когда-нибудь удалят, а пока есть и работает.

korvin_ ★★★★★
()

вот так попробуйте

    int res, i = 0;
    char *num = "5555"
    while (num[i] == *(argv[1]+i)) {
        if (num[i] == '\0') {
            res = 0;
            break;
        }
        i++;
    }
    res = str[i] - *(argv[1]+i);
    if (res == 0) {
        printf("num and argv[1] equal")
    }
IvanR ★★★
()
Ответ на: комментарий от IvanR

все дело в адресной арифметике.

argv[1] это int, содержащий адрес первого символа (первого аргумента программы)

argv[1]+1 это int содержащий адрес второго символа аргумента

*argv[1] это и есть первый символ строки

*argv[1]+1 это первый символ + 1 (если первый символ есть 5, то получим 6), поскольку мы прибавляем единицу не к адресу, а непосредственно к символу (байту), все дело в том .что приоритет * больше. чем приоритет +

*(argv[1]+1) вот то, что нам нужно, читается примерно так: берем адрес второго байта строки и разыменовываем (*), то есть берем непосредственно второй символ из argv[1]

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

Все это время анончик тщетно пытается оправдать жабу тем, что это не == работает неоднозначно, а = для Integer и числа. То есть в промежутке [-128, 127] число неявно заменяется объектом из кеша за соответствующим номером. А иначе new Integer-ом.

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

будь боксинг/анбоксинг в жабке изначально , примитивных типов(точнее явных свободных в нутрях функции, с агрегатами/полями можно было разрешить всё равно агрегат размещает жабка как ей удобно/опреденно_стандартом ) могло бы и не быть

а так вышел компромисс с одновременным существование обьектов которые менеджит рантайм и примитивные типы которые либо составная часть обьекта(что не очень страшно) либо «гте-то на стеке» - что чутка усложняет всю модель будь на стеке только сылки на обьекты в «менеджере памяти жабки» замыкания теже много проще было бы впилить и полноценые , а не с ацкими final

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

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

Вот. А у меня — пять! И strcmp работает в два раза быстрей. И объем памяти почти в 2 раза меньше!!!

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

Чувак, между 1ГБ и 2ГБ разница поразительна!

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

следуя вышеизложенному постулату саннируем типы - 1 символьный 1 целый 1 плавающий . тип адресс который тоже односимвольный.

ну а для всего остального однородные агрегаты с индексом ака массивы, агрегаты с именами ака структуры/записи , агрегаты со своими механизмами извлечения ака асоциативные/хэши/карты.

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

Все это время анончик тщетно пытается оправдать жабу

Оправдать в чём? В том что она по умолчанию кэширует объекты что ли? Всё это время я пытаюсь объяснить товарищам, что они не умеют сравнивать объекты в жаве.

а = для Integer и числа. То есть в промежутке [-128, 127] число неявно заменяется объектом из кеша за соответствующим номером. А иначе new Integer-ом.

Число неявно заменяется на «Integer.valueOf(число)». А он, в зависимости от того, что ты там накрутил в настройках, решает, что ему кэшировать.

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

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

если-бы они так не сделали, любой emulek мог-бы писать на жабе Ъ ынтерпрайзный код. (:

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

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

это ТЫ живёшь в идиотском мире.

у нас так:

$ echo "10^20+1"|bc
100000000000000000001

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

Согласен, но с флоатами другая история: там НЕВОЗМОЖНО сделать хорошо.

ты просто не осилил. На самом деле там НЕ НУЖНО твоё понимание «хорошо».

Hint: Как думаешь, почем время похода в магазин за водкой меряется в минутах, без учёта микросекунд? Задумайся об этом. И ты осмыслишь, почему float такой «неточный». Намёк на разгадку: это не баг, а фича.

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

если-бы они так не сделали, любой emulek мог-бы писать на жабе Ъ ынтерпрайзный код. (:

Да ты не расстраивайся, на самом деле любой edonkey может писать на жабе Ъ ынтерпразный код. Ты не задумывался, почему жаба тормозит?

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

Моя логика говорит, что сравнивая два Integer оператором ==, ты узнаешь один и тот же это объект или нет.

у тебя логика идиота. ИМХО.

ИМХО operator==() _обязан_ сравнивать _значения_, а не фантики, в которое это значение завёрнуто. Если сравниваешь «говно» == «конфета», то _должен_ получить false, причём пофиг до фантиков, в которое оно завёрнуто.

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

Вот. А у меня — пять! И strcmp работает в два раза быстрей. И объем памяти почти в 2 раза меньше!!!

в жопу такие «документы». Сравни, сколько занимает хотя-бы man mc на твоём диске в одной или в другой кодировке? Или сколько трафика уйдёт на русскую вебстраничку в utf-8 или koi8-r?

ВНЕЗАПНО: одинаково! (hint: man zlib)

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

1 символ обязан быть равным одному байту!

что за бред? Вот Кнут писал ПО даже для шестибитовых байтов, и что? Сам ведь смайлы вставляешь многобайтовые в свои посты...

Кому обязан-то?

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

ИМХО operator==() _обязан_ сравнивать _значения_, а не фантики, в которое это значение завёрнуто. Если сравниваешь «говно» == «конфета», то _должен_ получить false, причём пофиг до фантиков, в которое оно завёрнуто.

$ cat Test.c
#include <stdio.h>

int main(int argc, char *argv[]) {
  int a = 14;
  int b = 14;
  int* pA = &a;
  int* pB = &b;
  
  if (pA == pB) {
    printf("true\n");
  } else {
    printf("false\n");
  }

  return 0;
}
$ ./a.out
false

operator==() _обязан_ сравнивать _значения_, а не указатели, которые на это значение указывают, ага.

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

Да ты не расстраивайся, на самом деле любой edonkey может писать на жабе Ъ ынтерпразный код. Ты не задумывался, почему жаба тормозит?

зачем задумываться над очевидным? Понятное дело, что жабисты == ослы. Но они этого не знают (хотя и догадываются в глубине души, и от того у них такой лютый баттхерт)

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

зачем задумываться над очевидным? Понятное дело, что жабисты == ослы. Но они этого не знают (хотя и догадываются в глубине души, и от того у них такой лютый баттхерт)

Ну а что ты прибедняешься, мол не сможешь Ъ энтерпрайзный код написать? Сможешь же )

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

ага.

угу. В данном случае ты сравниваешь не конфеты, и не фантики. А две разные бумажки, причём на обоих написано слово «говно». Да, они разные. Я тебе больше скажу: сравнивать их с говном вообще НЕЛЬЗЯ, потому-же, почему нельзя сравнивать тёплое с мягким.

Для ликбеза почитай про указатели в сишечке. Это совсем НЕ Integer. Ну НИКАК.

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

угу. В данном случае ты сравниваешь не конфеты, и не фантики. А две разные бумажки, причём на обоих написано слово «говно». Да, они разные. Я тебе больше скажу: сравнивать их с говном вообще НЕЛЬЗЯ, потому-же, почему нельзя сравнивать тёплое с мягким.

Ты не поверишь, я чуть выше именно об этом говорил. А ты не прочитав начал заявлять о своём имхо. Сравнивай, блджад, int а не Integer. Или сравнивай методом equals.

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

Ну а что ты прибедняешься, мол не сможешь Ъ энтерпрайзный код написать? Сможешь же )

угадал. Я тебе больше скажу, я даже писал. Но не покажу, ибо стесняюсь. Да и вообще не принято срать в приличном обществе...

emulek
()
Ответ на: комментарий от Miguel
$ cat Test.java
public class Test {
  public static void main(String[] args) {
    Integer i = 5555;
    Integer j = 5555;
    System.out.println(i == j);
    System.out.println(i.equals(j));
  }
}
$ java Test
false
true
$ java -XX:AutoBoxCacheMax=5555 Test
true
true
anonymous
()
Ответ на: комментарий от anonymous

Ты не поверишь, я чуть выше именно об этом говорил. А ты не прочитав начал заявлять о своём имхо. Сравнивай, блджад, int а не Integer. Или сравнивай методом equals.

да? ну извини тогда, я был не прав...

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

ты лучше Мигелюшке дай ссылку на мануал, в котором рассказано, что такое Integer, и зачем он нужен. Пусть изучает.

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

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

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

ШТОА????

успокойся. Сишечка != ассемблер. Указатель в сишечке совершенно ДРУГАЯ сущность. Это НЕ целое. У них своя, особенная арифметика, мало того, их НЕЛЬЗЯ преобразовать в целое, это почти всегда UB. Также невозможна арифметика указателей и целых вместе. Только в том случае, если ты преобразуешь целое в специальный тип ptrdiff_t.

int array[3]; // объявление массива в 3 целых числа
*(array + 1) = 17; // в данном случае 1 преобразуется в ptrdiff_t
// причём в этом случае ptrdiff_t определён ТОЛЬКО для 0,1,2, и 3.
int d = &array[1] - &array[0]; // тут преобразование ptrdiff_t в int

в сишечке на архитектуре тез тегов указатель и есть чиселко которое адрес

твои знания устарели минимум на 20 лет. Для компилятора у указателя есть тег «указатель», и код он совсем другой делает. Даже для простых операторов типа x++; Это совсем НЕ инкремент целого.

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