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

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

а если компилятор тебе объединит int a = 31337, b = 31337; в одну область памяти, ты сильно этому обрадуешься?

Не знаю насчёт gcc точно, но вот в bcc была такая опция объединять одинаковые строковые литералы, и по дефолту она была выключена

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

ну мой libastral.so говорит, что ТС хотелось сравнивать числовые значения :)

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

Ну те кто используют строки (и тем более строковые литералы) как мутабельные сущности — изначально ССЗБ.

PolarFox ★★★★★
()
Ответ на: Я тоже так могу. от geekless

Кончайте молодняк пугать! =) Книгу бы ему лучше посоветовали → http://www.lib.ru/CTOTOR/ в частности K&R.

А вообще вопрос к anonymus123: чего это тебя на C потянуло? Может лучше с другого начать?

beastie ★★★★★
()

Оригинальное у вас сравнение строк. Тут вы указатели сравниваете:

char *num = «5555»;
if (argv[1] != num) {

А если параметров будет больше двух, то сообщение «no param» будет звучать как издевательство:

if (argc != 2) {
   printf(«No param\n»);
   exit(0);
}

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

Любой начинающей жабамакаке вдалбливают в голову про боксинг/анбоксинг и сравнение через equals(), насколько я знаю.

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

потому что num это {'5','5','5','5','\0'}
а то что в буфере stdio это {'5','5','5','5',\n','\0'}
Строки тупо разной длинны.

Слово «тупо» очень подходит к вашему сообщению.

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

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

ога. Вот и исправь у себя кодировку ;)

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

в ней не нужен ещё ты если чо
нахрена вообще вернулся на лор? проваливай, макака

anonymous
()

Common Lisp

И конечно с «элитными» ЯП:

[1]> (eq '#:lol '#:lol)
NIL

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

HNO-Arzt_
()
Ответ на: комментарий от Deleted

Любой начинающей жабамакаке вдалбливают в голову про боксинг/анбоксинг и сравнение через equals(), насколько я знаю.

Это всё круто, но при этом оператор «<» работает как надо, арифметика тоже работает, инициализация константами (без new) — тоже. Не работает только == и !=.

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

давай сам ищи. Выше пруф по мнению gcc, не подходит?

какой пруф? Варнинг? Варнинги часто сообщают пользователю о возможно некорректном коде вроде if(n = 4), который чист с точки зрения стандарта.

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

А как на таком сайте написать «Мюнхен (нем. München [ˈmʏnçən])» или что-нибудь в этом духе (цитату на латыни, например)?

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

Варнинг?

там же английским по чёрному написано: «comparison with string literal results in unspecified behavior».

Варнинги часто сообщают пользователю о возможно некорректном коде вроде if(n = 4), который чист с точки зрения стандарта.

там совсем другое пишут( warning: suggest parentheses around assignment used as truth value [-Wparentheses]). В данном случае ты скорее всего просто банально очепятался, ибо вот такой вариант как ты привёл, смысла никакого не имеет, n=4 всегда истинно. Ну и даже если это и имеет смысл, то всё равно, при чтении кода это можно пропустить, и понять неправильно (как будто «==»), потому и нужно это выделить, например ещё скобками, тогда этот хитрый участок if((n=4)) выделяется, и очень бросается в глаза, ну и варнинг тоже исчезает.

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

А как на таком сайте написать «Мюнхен (нем. München [ˈmʏnçən])» или что-нибудь в этом духе (цитату на латыни, например)?

также, как он здесь смайлы лепет, & # бла-бла-бла;

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

А про варнинг: если явно ошибочная строчка выдаёт всего лишь варнинг, то рано или поздно она попадёт в кодовую базу крупного проекта.

И какой из этого следует вывод?

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

И какой из этого следует вывод?

все крупные проекты целиком сделаны из ошибок

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

Угу, в жабе даже 5555 == 5555 может дать False.

$ cat Test.java
public class Test {
  public static void main(String[] args) {
    Integer i = 5555;
    Integer j = 5555;
    System.out.println(i == j);
  }
}

$ java Test
false

5555 == 5555

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

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

Да уж, не зря мне Go в последнее время нравится всё больше и больше. ;)

...

~/prog/go/src/test $ cat test.go 
package main

import "fmt"

const str1 = "abrakadabra"
const str2 = "не abrakadabra"

func main() {
	if str1 == str2[3:] {
		fmt.Println("Mama-mia!")
	}
}
~/prog/go/src/test $ go run test.go 
~/prog/go/src/test $ 

Так-то. Hint: string == []byte != []rune

korvin_ ★★★★★
()
Ответ на: комментарий от blogdron
argv[1] != num
printf("Fail arg %d\n",argv[1]);
%d

А теперь попробуй запустить с аргументом.

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

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

От столкновения с жестокой реальностью, видимо.

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

От столкновения с жестокой реальностью, видимо.
с жестокой реальностью

Ты даже не представляешь, насколько прав.

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

Ох ё.. А строки как сортировать?

лучше никак не сортировать, в силу того, что это само по себе долго. Ну уж если надо (для человеков, на выводе), то wcscmp(3)...

А внутри программы лучше сделать хеш строки, и сортировать по нему. Это быстрее и памяти меньше жрёт(и, что важно, расширяемо на любое N*M)

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

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

это жаба, детка. Ты ещё php не видел...

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

это жаба, детка. Ты ещё php не видел...

Ты ничего не понял, но тебе я, так и быть, объясню. В жабе это две разные вещи:

5555 == 5555
Integer i = 5555;
Integer j = 5555;
System.out.println(i == j);
Товарищ выше их спутал, очевидно непреднамеренно, сильно удивив коро^W мой мозг.

anonymous
()
Ответ на: комментарий от Miguel
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));
  }
}

kirill@haruhi:/tmp$ java Test 
false
true
LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

equals() ты не осилил? Объекты только так можно сравнивать.

На будущее: когда пытаешься троллить, задавай вопросы, но старайся не делать высказываний. Шансов сказать глупость будет меньше. Вот сейчас он придёт и расскажет тебе, зачем нужны ==, !=, equals, hashcode, compareto и ещё дюжина разных вкусняшек.

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

правильно, значение первого элемента массива символов, коим является строка. Можешь извратиться, найти следующее значение, поймать терминатор строки, но ты сделаешь тот же strcmp

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

А теперь так!

$ cat Test.java
public class Test {
  public static void main(String[] args) {
    Integer i = 5555;
    Integer j = 5555;
    System.out.println(i == j);
    Integer a = 55;
    Integer b = 55;
    System.out.println(a == b);
  }
}

$ java Test
false
true
Kuzy ★★★
()
Ответ на: комментарий от Kuzy

А теперь так!

Тебе объяснить что ты сделал и почему так получилось? Или ты просто пытался меня удивить?

anonymous
()

anonymus123, тебе нужен С++ :)

#include <string>
#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[]) {
    if (argc < 2) {
        // Выводим сообщение на ошибке и выходим
        cerr << "No params" << endl;
        return EXIT_FAILURE;
    }

    // Превращаем argv[1] в строку
    string arg1 = argv[1];

    // И просто сравниваем :)
    if (arg1 != "5555") {
        cerr << "First argument is not 5555" << endl;
        return EXIT_FAILURE;
    }

    cout << "First arg is: " << arg1 << endl;

    return EXIT_SUCCESS;
}


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

этот тред набрал 145 комментариев...

Это еще не конец, сейчас еще смысл жизни перетрут как минимум...

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

Тебе объяснить что ты сделал и почему так получилось? Или ты просто пытался меня удивить?

человека, незнакомого с Java, это действительно может и должно удивлять

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

После C чувствуешь себя как в усмирительной рубашке. =) А ещё мне не нравится, что нет «относительных» путей у модулей.

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

Ага, а бывает таков адъ.

public class Test {
  public static void main(String[] args) {
    System.out.println( true ? new Integer(1) + '.' + "0" : new Double(2) );
  }
}

~$ java Test
470

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