Java vs C++ (Или я тупой или Java...)
Модератор: Модераторы разделов
-
amdhacker
- Сообщения: 5
Java vs C++
Известный прикол что такое С/С++ в варианте С++/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:
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++
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++
постфиксный инкремент выполняется с сайд-эфектом. операция деления в С/С++ не является точкой следования, а значит этот сайд-эффект не обязан быть закреплен к моменту выполнения деления. откуда вообще взялась мысль, что С++ ведет себя правильно? если я еще не совсем обезумел, то этот пример ведет к undefined behavior. поэтому выдаваться там может все что угодно.
а 0 в яве получается очень просто.
С=1; сайд-эффект от C++ к моменту деления уже закреплен. поэтому получается 1/2 = 0;
все очень просто.
отсюда вытекает вполне однозначный ответ на твой вопрос: ты тупой.
мой тебе совет, если используешь gcc, всегда собирай свои програмки с -Wall - узнаешь о себе много нового.
а 0 в яве получается очень просто.
С=1; сайд-эффект от C++ к моменту деления уже закреплен. поэтому получается 1/2 = 0;
все очень просто.
отсюда вытекает вполне однозначный ответ на твой вопрос: ты тупой.
мой тебе совет, если используешь gcc, всегда собирай свои програмки с -Wall - узнаешь о себе много нового.
слава роботам!
-
Satellite13
- Сообщения: 3
Re: Java vs C++
Меняем вот так и понимаем, что то неладно в королевстве Датском
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
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++
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++
rpv
ты вообще читаешь сообщения в ветке?
ты вообще читаешь сообщения в ветке?
нет никакого вопроса. этот поганый мир устроен так, что получение там 1 ничем не хуже получения там же -2112573345 - оба этих варианта неправильны. но самое страшное в том, что правильного ответа НЕТ.операция деления в С/С++ не является точкой следования, а значит этот сайд-эффект не обязан быть закреплен к моменту выполнения деления.
слава роботам!
-
rpv
- Сообщения: 28
- ОС: Ubuntu
Re: Java vs C++
Значит эта неоднозначность остается на усмотрение компилятора?
Ubuntu 6.10 и WinXP - вот как-то так...
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Java vs C++
если неоднозначность остается на усмотрение компилятора, то в стандарте пишется, что это "implementation-dependent behavior". это гарантирует, что одна и та же версия одного и того же компилятора обеспечивает некое одинаковое поведение во всех подобных случаях.
если в стандарте сказано, что это - "undefined behavior", то это означает, что один и тот же компилятор в зависимости от фаз луны или давления крови овцы Долли, светлая ей память, может возвращять 1, 10, 15, обеспечивать segmenatation fault, форматировать винт, менять стрелки на железной дороге или облучать тебя синими лучами из космоса........
причем случаи неопределенного поведения, связанные с точками следования и закреплением сайд-эффектов при вычислениях, обсосаны такое количество раз, что даже у самых терпеливых людей развивается идиосинкразия, и им очень хочется ловить каждого, кто снова спросит об этом, и бить его головой о распечатку стандарта C99 до тех пор, пока у него не наступит просветление. и даже немного дольше.
если в стандарте сказано, что это - "undefined behavior", то это означает, что один и тот же компилятор в зависимости от фаз луны или давления крови овцы Долли, светлая ей память, может возвращять 1, 10, 15, обеспечивать segmenatation fault, форматировать винт, менять стрелки на железной дороге или облучать тебя синими лучами из космоса........
причем случаи неопределенного поведения, связанные с точками следования и закреплением сайд-эффектов при вычислениях, обсосаны такое количество раз, что даже у самых терпеливых людей развивается идиосинкразия, и им очень хочется ловить каждого, кто снова спросит об этом, и бить его головой о распечатку стандарта C99 до тех пор, пока у него не наступит просветление. и даже немного дольше.
слава роботам!
-
amdhacker
- Сообщения: 5
Re: Java vs C++
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
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Java vs C++
http://www.open-std.org/jtc1/sc22/wg14/www/standards.htmlА где взять стандарт С99 ?
если там не разберешься, то вот более конкретная ссылка: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
а теперь угадай, откуда я это узнал? даю подсказку: начинается на "goo", заканчивается на "gle.com".
так как раз к Яве нет вопросов. точную цитату не приведу (искать лень), но в JLS четко описывается именно такой порядок вычислений. и твой пример этому порядку соответствует. поэтому с явой все чисто.вопрос скорее относился к Java а не к С++
с С тоже все понятно. поведение стандартом не определено, поэтому никакое поведение ничему соответствовать не может. что бы в результате не получилось, все равно будет неправильно (:
слава роботам!
-
rpv
- Сообщения: 28
- ОС: Ubuntu
Re: Java vs C++
elide писал(а): ↑25.05.2006 20:11http://www.open-std.org/jtc1/sc22/wg14/www/standards.htmlА где взять стандарт С99 ?
если там не разберешься, то вот более конкретная ссылка: 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++
У меня толкьо один вопрос почему C++ а не С ведь стиль написания какраз таки принятый в С да и printf С-шная функция. Или меня как то неправильно C++ учили.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
-
amdhacker
- Сообщения: 5
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Java vs C++
Странно тогда вы форум выбрали для своего вопроса, однако.(amdhacker @ May 26 2006, в 17:01) писал(а):не важно - компилятор MSVC 2003
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж