Java vs C++ (Или я тупой или Java...)

Модератор: Модераторы разделов

amdhacker
Сообщения: 5

Java vs C++

Сообщение amdhacker »

Известный прикол что такое С/С++ в варианте С++/C не предвещал беды, но посмотрите что по этому поводу думает Java...

Пример:
Java:

public class Main
{
public Main() {
}

public static void main(String[]
{
int C = 1;
System.out.format("Java: What is C++/C : %d\n", C++/C);
System.out.format("Java: What is C : %d\n", C);
}

}

Результат:
Java: What is C++/C : 0
Java: What is C : 2

С++:
#include <stdio.h>
#include <conio.h>

int main(int argc, char* argv[])
{
int C = 1;
printf("C++: What is C++/C : %d\n", C++/C);
printf("C++: What is C : %d\n", C);

getch();
return 0;
}

Результат:

C++: What is C++/C : 1
C++: What is C : 2

C++ ведет себя правильно, но откуда в Java взялся ноль?
Спасибо сказали:
rpv
Сообщения: 28
ОС: Ubuntu

Re: Java vs C++

Сообщение rpv »

amdhacker писал(а):
25.05.2006 12:50
Известный прикол что такое С/С++ в варианте С++/C не предвещал беды, но посмотрите что по этому поводу думает Java...

Пример:
Java:

public class Main
{
public Main() {
}

public static void main(String[]
{
int C = 1;
System.out.format("Java: What is C++/C : %d\n", C++/C);
System.out.format("Java: What is C : %d\n", C);
}

}

Результат:
Java: What is C++/C : 0
Java: What is C : 2

С++:
#include <stdio.h>
#include <conio.h>

int main(int argc, char* argv[])
{
int C = 1;
printf("C++: What is C++/C : %d\n", C++/C);
printf("C++: What is C : %d\n", C);

getch();
return 0;
}

Результат:

C++: What is C++/C : 1
C++: What is C : 2

C++ ведет себя правильно, но откуда в Java взялся ноль?


Может я и не прав, но мое мнение:
На Java - С в левой части выражения равно 1, но в правой части уже равно 2, итого 0.5 при приведении к целому получается 0
На С++ - инкремент происходит после вычисления выражения, поэтому итого 1
Ubuntu 6.10 и WinXP - вот как-то так...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Java vs C++

Сообщение elide »

постфиксный инкремент выполняется с сайд-эфектом. операция деления в С/С++ не является точкой следования, а значит этот сайд-эффект не обязан быть закреплен к моменту выполнения деления. откуда вообще взялась мысль, что С++ ведет себя правильно? если я еще не совсем обезумел, то этот пример ведет к undefined behavior. поэтому выдаваться там может все что угодно.

а 0 в яве получается очень просто.
С=1; сайд-эффект от C++ к моменту деления уже закреплен. поэтому получается 1/2 = 0;
все очень просто.

отсюда вытекает вполне однозначный ответ на твой вопрос: ты тупой.
мой тебе совет, если используешь gcc, всегда собирай свои програмки с -Wall - узнаешь о себе много нового.
слава роботам!
Спасибо сказали:
Satellite13
Сообщения: 3

Re: Java vs C++

Сообщение Satellite13 »

Меняем вот так и понимаем, что то неладно в королевстве Датском

public class Main
{
public Main() {
}

public static void main(String[]
{
float C = 1;
System.out.format("Java: What is C++/C : %f\n", C++/C);
System.out.format("Java: What is C : %f\n", C);
}

}

Результат:
Java: What is C++/C : 0.5
Java: What is C : 2
Спасибо сказали:
rpv
Сообщения: 28
ОС: Ubuntu

Re: Java vs C++

Сообщение rpv »

Satellite13 писал(а):
25.05.2006 13:52
Меняем вот так и понимаем, что то неладно в королевстве Датском

public class Main
{
public Main() {
}

public static void main(String[]
{
float C = 1;
System.out.format("Java: What is C++/C : %f\n", C++/C);
System.out.format("Java: What is C : %f\n", C);
}

}

Результат:
Java: What is C++/C : 0.5
Java: What is C : 2



Так что вопрос другой - почему в С++ получается 1?
Ubuntu 6.10 и WinXP - вот как-то так...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Java vs C++

Сообщение elide »

rpv
ты вообще читаешь сообщения в ветке?
операция деления в С/С++ не является точкой следования, а значит этот сайд-эффект не обязан быть закреплен к моменту выполнения деления.
нет никакого вопроса. этот поганый мир устроен так, что получение там 1 ничем не хуже получения там же -2112573345 - оба этих варианта неправильны. но самое страшное в том, что правильного ответа НЕТ.
слава роботам!
Спасибо сказали:
rpv
Сообщения: 28
ОС: Ubuntu

Re: Java vs C++

Сообщение rpv »

Значит эта неоднозначность остается на усмотрение компилятора?
Ubuntu 6.10 и WinXP - вот как-то так...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Java vs C++

Сообщение elide »

если неоднозначность остается на усмотрение компилятора, то в стандарте пишется, что это "implementation-dependent behavior". это гарантирует, что одна и та же версия одного и того же компилятора обеспечивает некое одинаковое поведение во всех подобных случаях.
если в стандарте сказано, что это - "undefined behavior", то это означает, что один и тот же компилятор в зависимости от фаз луны или давления крови овцы Долли, светлая ей память, может возвращять 1, 10, 15, обеспечивать segmenatation fault, форматировать винт, менять стрелки на железной дороге или облучать тебя синими лучами из космоса........
причем случаи неопределенного поведения, связанные с точками следования и закреплением сайд-эффектов при вычислениях, обсосаны такое количество раз, что даже у самых терпеливых людей развивается идиосинкразия, и им очень хочется ловить каждого, кто снова спросит об этом, и бить его головой о распечатку стандарта C99 до тех пор, пока у него не наступит просветление. и даже немного дольше.
слава роботам!
Спасибо сказали:
amdhacker
Сообщения: 5

Re: Java vs C++

Сообщение amdhacker »

elide писал(а):
25.05.2006 13:43
постфиксный инкремент выполняется с сайд-эфектом. операция деления в С/С++ не является точкой следования, а значит этот сайд-эффект не обязан быть закреплен к моменту выполнения деления. откуда вообще взялась мысль, что С++ ведет себя правильно? если я еще не совсем обезумел, то этот пример ведет к undefined behavior. поэтому выдаваться там может все что угодно.

а 0 в яве получается очень просто.
С=1; сайд-эффект от C++ к моменту деления уже закреплен. поэтому получается 1/2 = 0;
все очень просто.

отсюда вытекает вполне однозначный ответ на твой вопрос: ты тупой.
мой тебе совет, если используешь gcc, всегда собирай свои програмки с -Wall - узнаешь о себе много нового.


ну про undefined behavior это гон, максимум если С=0 может получиться деление на 0 и то в С++
Вся проблема состоит в том что в Java порадок вычисления строго определен (слева на право), а в C++ нет.

elide писал(а):
25.05.2006 14:39
если неоднозначность остается на усмотрение компилятора, то в стандарте пишется, что это "implementation-dependent behavior". это гарантирует, что одна и та же версия одного и того же компилятора обеспечивает некое одинаковое поведение во всех подобных случаях.
если в стандарте сказано, что это - "undefined behavior", то это означает, что один и тот же компилятор в зависимости от фаз луны или давления крови овцы Долли, светлая ей память, может возвращять 1, 10, 15, обеспечивать segmenatation fault, форматировать винт, менять стрелки на железной дороге или облучать тебя синими лучами из космоса........
причем случаи неопределенного поведения, связанные с точками следования и закреплением сайд-эффектов при вычислениях, обсосаны такое количество раз, что даже у самых терпеливых людей развивается идиосинкразия, и им очень хочется ловить каждого, кто снова спросит об этом, и бить его головой о распечатку стандарта C99 до тех пор, пока у него не наступит просветление. и даже немного дольше.

вопрос скорее относился к Java а не к С++, в любом случае такие вещи лучше не писать(A/A++, hello(a, a++); и тд )
Спасибо сказали:
rpv
Сообщения: 28
ОС: Ubuntu

Re: Java vs C++

Сообщение rpv »

А где взять стандарт С99 ?
Ubuntu 6.10 и WinXP - вот как-то так...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Java vs C++

Сообщение elide »

А где взять стандарт С99 ?
http://www.open-std.org/jtc1/sc22/wg14/www/standards.html
если там не разберешься, то вот более конкретная ссылка: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
а теперь угадай, откуда я это узнал? даю подсказку: начинается на "goo", заканчивается на "gle.com".

вопрос скорее относился к Java а не к С++
так как раз к Яве нет вопросов. точную цитату не приведу (искать лень), но в JLS четко описывается именно такой порядок вычислений. и твой пример этому порядку соответствует. поэтому с явой все чисто.
с С тоже все понятно. поведение стандартом не определено, поэтому никакое поведение ничему соответствовать не может. что бы в результате не получилось, все равно будет неправильно (:
слава роботам!
Спасибо сказали:
rpv
Сообщения: 28
ОС: Ubuntu

Re: Java vs C++

Сообщение rpv »

elide писал(а):
25.05.2006 20:11
А где взять стандарт С99 ?
http://www.open-std.org/jtc1/sc22/wg14/www/standards.html
если там не разберешься, то вот более конкретная ссылка: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
а теперь угадай, откуда я это узнал? даю подсказку: начинается на "goo", заканчивается на "gle.com".

Вот спасибо за google, а вот мне он ничего путного не сказал. Может я просто не умею его готовить...
Ubuntu 6.10 и WinXP - вот как-то так...
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: Java vs C++

Сообщение Slimy »

У меня толкьо один вопрос почему C++ а не С ведь стиль написания какраз таки принятый в С да и printf С-шная функция. Или меня как то неправильно C++ учили.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
amdhacker
Сообщения: 5

Re: Java vs C++

Сообщение amdhacker »

Slimy писал(а):
26.05.2006 15:13
У меня толкьо один вопрос почему C++ а не С ведь стиль написания какраз таки принятый в С да и printf С-шная функция. Или меня как то неправильно C++ учили.


не важно - компилятор MSVC 2003 (т.е C++)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Java vs C++

Сообщение t.t »

(amdhacker @ May 26 2006, в 17:01) писал(а):не важно - компилятор MSVC 2003
Странно тогда вы форум выбрали для своего вопроса, однако.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: