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

продолжаем:

~$ cat Test.java
public class Test {
  public static void main(String[] args) {
	System.out.println(new Long(1) == 1); 
	System.out.println(new Long(1).equals(1));
  }
}

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

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

Так надо с языком немного ознакомиться, прежде чем на нём писать-читать. Это же самые основы.

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

equals() ты не осилил?

Ты дурак совсем? Перечитай ещё раз, о чём был кипеш.

Miguel ★★★★★
()
Ответ на: комментарий от wota
~$ cat Test.java
public class Test {
  public static void main(String[] args) {
    int a = new Integer(42);
    Integer b = new Integer(42);
    Integer c = new Integer(42);

    System.out.println(a == b);
    System.out.println(a == c);
    System.out.println(b == c);
  }
}

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

незачем. но такое поведение это, извините, феерический пипец.

Поведение логично.

public class Test {
  public static void main(String[] args) {
    Integer[] array = new Integer[100];
    for (int i = 0; i < array.length; i++) {
      array[i] = 42;
    }
  }
}

Чтобы не заси^W засорять память (лол), жабомашина вместо того чтобы создавать 100 одинаковых объектов, создаст один в кэше и будет ссылаться на него.

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

Это не логика, а банальная протечка абстракций.

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

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

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

Мне лестно, что ты считаешь меня разрабом JVM, но ты снова ошибся.

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

Выше и я объяснял и wota ссылку дал.

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

Внезапно, но мне нужно именно 100 и именно новых интов. А не 100 ссылок на один инт. Что делать? (Я уже не говорю о том, что поведение не логично относительно других жабаклассов, например относительно класса MySuperInteger)

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

Внезапно, но мне нужно именно 100 и именно новых интов.

На фейхуа? Но если хочется:

public class Test {
  public static void main(String[] args) {
    Integer[] array = new Integer[100];
    for (int i = 0; i < array.length; i++) {
      array[i] = new Integer(42);
    }
  }
}

поведение не логично относительно других жабаклассов

Причём тут логичность? Кэш твоего браузера нелогичен относительно домохозяйка.ру?

Про тоже на русском: http://habrahabr.ru/post/132241/

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

А ещё мне не нравится, что нет «относительных» путей у модулей.

Относительных относительно чему?

import "./inner/pkg1"

не?

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

Причём тут логичность?

Притом что Integer - объект, но в некоторых ситуациях, ведет себя не как объект.

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

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

А абсолюныне пути как-то совсем не комильфо.

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

Притом что Integer - объект, но в некоторых ситуациях, ведет себя не как объект.

С c# не путай, это там объекты могут вести себя «не как объекты», да и то имеет весьма «объектное» объяснение. В джаве объекты во всех ситуациях ведут себя как объекты.

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

Т. к. после забытия и восстановления пароля не могу создавать собственные темы,
спрошу здесь, созвучно стартовому вопросу.
Имеется самодельная программа, которая хорошо работала на одной машине, но при
переносе на другую машину не стала работать. Я нашел «ошибку», которую раньше
не считал ошибкой.
Было:

struct jp {
	const char *njZZ;
	  ....
};

void jp_init_struct(...)
{
	const char njZZ[64] = { 0, 1, 8, 16, 9, 2, 3 ...};
	jp->njZZ = njZZ;
	  ....
}

int get_matric_prg(...)
{
	const char *njZZ;
	njZZ = jp->njZZ;  // это не работает
	  ....
}

Стало:

int get_matric_prg(...)
{
	const char njZZ[64] = { 0, 1, 8, 16, 9, 2, 3 ...}; // это работает
	  ....
}

Кто-нибудь объясните, почему так? Ведь njZZ-массив должен лежать в константной
памяити, не локальной.

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

константной памяити

Что это такое? В моих сях такого вроде не было. Ты глобальные/локальные/статические/переменные/константные не напутал?

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

«Константная память» где лежат константы, где-то они должны же лежать,
может это и называется статической памятью? Проще сказать, я не знаю,
что такое статическая память, только догадываюсь.
Память под структуру выделяется malloc-ом, глобальных переменных нет.
Указатель на структуру передается в аргументах функций.

Я думал, что указатель на этот массив:

const char njZZ[64] = { 0, 1, 8, 16, 9, 2, 3 ...};
будет работать всюду, хотя сам массив определен как бы локально.
Вот похожий пример, какие есть в учебнике:
const char* fun(...)
{
      ....
    if(плохо) return("плохо");
    return("хорошо");
}
Константы определены как бы локально, но доступны нелокально.

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

будет работать всюду, хотя сам массив определен как бы локально.

Я в стандарте C не силён, так что не могу сказать, правильно ли ты делаешь или undefined behaviour. Я бы просто сделал из этого массива глобальную константную.

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

Чтобы не заси^W засорять память (лол), жабомашина вместо того чтобы создавать 100 одинаковых объектов, создаст один в кэше и будет ссылаться на него.

Ню-ню. И почему же это перестаёт действовать для числа 420?

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

Ню-ню. И почему же это перестаёт действовать для числа 420?

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

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

При старте жавамашины по умолчанию в кэше значение до 127.

И почему же после 127 засорение памяти вдруг становится неважным?

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

И почему же после 127 засорение памяти вдруг становится неважным?

В жаве инт размером 4 байта. Соотсветственно он может иметь 2^32 значения. 2^32*4 байта = 16 гибибайтов, если я не ошибаюсь. Предлагаешь кэшировать всё?

anonymous
()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            long number = 1;
            System.Console.WriteLine(number == 1);
            System.Console.WriteLine(number.Equals(1));
            System.Console.WriteLine(number.Equals(number));
        }
    }
}
Test1.exe
True
True
True
bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 2)
Ответ на: комментарий от oleg_2

Локальный массив, вне зависимости от const, имеет право накатиться локально на стеке, то есть

const char njZZ[64] = { 0, 1, 8, 16, 9, 2, 3 ...};

может сделать subq $72, %rsp в начале функции, заполнить это пространство в стеке и потом сделать addq $72, %rsp в конце функции. В итоге значением указателя njZZ будет адрес на стеке — на начало этого массива. Либо компилятор может разместить массив в .rodata, тогда значением njZZ будет адрес на .rodata и в таком случае всё будет работать.

Нужно

void jp_init_struct(...)
{
	static const char njZZ[64] = { 0, 1, 8, 16, 9, 2, 3 ...};

или

void jp_init_struct(...)
{
    const char *njZZ = "\0\x1\x8\xf\x9\x2\x3...";

тогда njZZ точно будет указывать в .rodata.

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

Что значит «не работает»?

-Wreturn-stack-address (-> мусор или сегфолт). Просто у него через структуру передача, поэтому -Wall не поможет.

quasimoto ★★★★
()
Ответ на: комментарий от bhfq
~$ cat Test.java
public class Test {
  public static void main(String[] args) {
    long number = 1;
    System.out.println(number == 1);
    // А всё, нету в жаве у long методов.
    // И не нужны они, ибо сравнивать можно оператором ==.
    // Не надо искать приключений на свою задницу.
  }
}

~$ java Test
true
anonymous
()
Ответ на: комментарий от quasimoto

quasimoto, спасибо, теперь всё понятно, при случае проверю эти варианты.

Miguel =Что значит «не работает»?=

В массиве мусор.

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

В поведении оператора ==.

В яве есть примитивные типы: byte, short, int, long, float, double, char, boolean. И есть ссылки на объекты, эдакий огороженный аналог указателей в сях.

Когда ты сравниваешь переменные примитивных типов с помощью ==, сравниваются значения переменных. 1 == 1, но 1 == 2.

Когда ты сравниваешь ссылки на объекты с помощью ==, ты не поверишь, сравниваются значения ссылкок, а не объекты. Как будто ты в сях сравниваешь указатели. Если a и b - это один и тот же объект, значит a == b. Если a и b - два разных объекта, значит a != b.

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

Всё элементарно просто.

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

Ты бы аргументы функций хоть оставил. Не читабельно ведь совсем, кругом одно njZZ.

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

Всё элементарно просто.

Ты не понял.

Неважно, сколько раз ты будешь объяснять, почему 42 == 42, а 420 != 420. Это всё равно останется маразмом.

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

Неважно, сколько раз ты будешь объяснять, почему 42 == 42, а 420 != 420. Это всё равно останется маразмом.

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

anonymous
()

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

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