LINUX.ORG.RU

И это мэйнстримный язык?

 , , ,


0

3

Имеем содержимое файла testbool.cpp

#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    bool foo = 7 > 0;
    cout << foo << endl;
    bool bar = 7.5;
    cout << bar << endl;
    bool baz = "dont't foo";
    cout << baz << endl;
    return 0;
}
Компилируем:
den@haruhi:/tmp$ g++ -o testbool testbool.cpp
den@haruhi:/tmp$ ./testbool 
1
1

den@haruhi:/tmp$ g++ -Wall -o testbool testbool.cpp
den@haruhi:/tmp$ 

den@haruhi:/tmp$ g++ -std=c++0x -Wall -o testbool testbool.cpp
den@haruhi:/tmp$

Ничего, ни одного предупреждения несмотря на явное несоответствие типов.

Код на Java:

public class Main
{
    public static void main(String args[])
    {
        boolean foo = 7.5 < 0;
        System.out.println(foo);
        boolean baz = "Хурдыбурды";
        System.out.println(baz);
    }
}
Вывод компилятора:
den@haruhi:/tmp$ javac Main.java 
Main.java:7: incompatible types
found   : java.lang.String
required: boolean
		boolean baz = "Хурдыбурды";
		              ^
1 error

И как это понимать? Где «логический тип» в С++?

★★★★★

Последнее исправление: LongLiveUbuntu (всего исправлений: 1)

Программист на С++ слишком крут и не допускает ошибки типов никогда

Но вообще это фича языка, можно засунуть в булево выражение что угодно. Чтобы можно было if (x) {

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
$ clang++ q.cc
q.cc:7:16: warning: implicit conversion from 'double' to 'bool' changes value
      from 7.5 to true [-Wliteral-conversion]
    bool bar = 7.5;
         ~~~   ^~~
1 warning generated.

i-rinat ★★★★★
()

пф. скорее всего для простых типов определены bool operator(). Попробуй компильнуть такое:

#include <iostream>

using namespace std;

class AA
{};

int main()
{
  AA a;
  bool b = a;
  cout << b << endl;
}
так что йава реально с карамелькой за щекой.

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

Просто не думал, что маразм там настолько глубок.

LongLiveUbuntu ★★★★★
() автор топика

И как это понимать? Где «логический тип» в С++?

логический тип на самом деле int. И вполне это очень удобно для адресной арифметики. А java слишком параноидальная — даже указателей то толком нет.

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

сцуко, я уж подумал у вас с TC раздвоение личности. аватарки слишком похожи.

u283
()

C++
адекватность

Выберите что-то одно.

Deleted
()
Ответ на: комментарий от nanoolinux
public class Main
{
    public static void main(String args[])
    {
        boolean foo = 7.5 < 0;
        System.out.println(foo);
        boolean baz = "Хурдыбурды";
        System.out.println(baz);
        double d = 2.3;
        int i = d;
    }
}

Вывод компилятора:

den@haruhi:/tmp$ javac Main.java 
Main.java:7: incompatible types
found   : java.lang.String
required: boolean
		boolean baz = "Хурдыбурды";
		              ^
Main.java:10: possible loss of precision
found   : double
required: int
		int i = d;
		        ^
2 errors

С точки зрения javac это даже не предупреждение.

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

Значит компилер говно?

На самом деле проблема не только в компилере. Проблема у истоков C++. Это попытка сохранить совместимость с C. В C 0 - false, не 0 - true. Строка это указатель и он не равен 0, а значит true.

Ведь выражение while (<bool expresion>) {} можно записать while (1) {}, а можно while (true) {}. Если компилятор постоянно ругался бы, то получилось бы такое количество ругани в смешанных (C + С++) проектах, что просто на предупреждения перестали бы обращать внимание.

С++ все равно намного строже чем C.

А вот Java это другое дело. У разработчиков не было идеи ни сохранить совместимость со всем что можно, ни сделать суперязык (типа common lisp, haskel или C++). Они сделали простой язык, богатую библиотеку стандартных классов и даже подумали сразу о соглашениях по написанию кода. Java - это сейчас мейнстрим: Web, Android, Enterpise и много чего еще. C++ legacy code + код с высокими требованиями к быстродействию. Но на мой взгляд в плане быстродействия лучше сразу на C - он намного проще. Так голова не болит то ли использовать исключения, то ли нет, какой из 100500 классов строки взять (их нет и проблем нет :).

olegk ★★
()

Ничего, ни одного предупреждения несмотря на явное несоответствие типов.

Все там нормально.

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

Какая версия шланга?

$ clang++ --version
Debian clang version 3.3-1 (branches/release_33) (based on LLVM 3.3)
Target: x86_64-pc-linux-gnu
Thread model: posix
i-rinat ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Значит компилер говно?

Всё говно. Поэтому я прогоняю свои поделки через разные компиляторы, включаю параноидальные -Wall -Wextra, и стараюсь добиться, чтобы ни одного предупреждения не было.

В последний раз так не сделал и искал ошибку (опечатка) две недели. Правда заодно нашёл ещё три, уже не опечатки.

i-rinat ★★★★★
()

наследие С, но при том и удобная вещь, можно писать:

if( count )
if( ptr )

или даже

if( auto ptr = ... )

хотя последнее не приветствуется

wota ★★
()

это фича языка, читай описание bool в стандарте :)

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

Строка это указатель и он не равен 0, а значит true.

А ведь технически ничего не мешает ему быть равным 0. Да, так исторически сложилось, что страница адресного пространства, начинающаяся по адресу 0, обычно используется для отлавливания неинициализированных указателей и кидания сегфолтов, но ведь на какой-то платформе это может быть не так, и строка разместится по адресу 0

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

Не хотел отвечать на грубость. Просто замечу. Дело ведь не в страницах, а в понятности для человека. Я сам ничего против не имею Haskell. Сам им занимался не долго, из функциональных достаточно долго увлекался erlang и scheme. И мне erlang очень много дал в понимании, как правильно организовать многопоточные приложения (хотя язык тут не столь важен).

Если вы откроете спецификацию Java то увидете, что там есть разделы по бинарной совместимости и даже по многопоточности. Java просто стандартизирован до мелочей. Например для сравнения в Java стандартизирован даже name mangling для перегрузки методов в отличии от C++.

А по Haskell это просто report (отчет о проделанной научной работе).

Открываем раздел типов:

Haskell Haskell uses a traditional Hindley-Milner polymorphic type system to provide a static type semantics [4, 6], but the type system has been extended with type classes (or just classes) that provide a structured way to introduce overloaded functions.

А дальше читаем две книги про то, что кто такие Хиндли и Мильнер.

Java:

The types of the Java programming language are divided into two categories: primitive types and reference types. The primitive types (§4.2) are the boolean type and the numeric types. The numeric types are the integral types byte, short, int, long, and char, and the floating-point types float and double. The reference types (§4.3) are class types, interface types, and array types.

Т.е. ссылки на этот же документ.

Такое ощущение, что вы скинули информацию не посмотрев даже.

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

но ведь на какой-то платформе это может быть не так, и строка разместится по адресу 0

никаких проблем, во-первых при касте 0 к указателю может получится совсем не 0, если платформа требует этого, во-вторых к чему бы ни кастилось - стандарт говорит, что по этому адресу ничего не должно размещаться

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

достаточно для чего? C++ — язык по большей части системного программирования. Java язык для продакшена. Это немного разные сферы, с разными инструментами и возможностями. Мне например, в джаве ой как не хватает указателей, а не эти_ваших_ссылок неизвестно на что сгенерированных виртуально машиной. да, когда я пишу на джаве состояние реальной памяти меня волновать не должно — но оно волнует.
Но у java есть свои преимущества перед с++, это нормально. Поэтому их сравнение по меньшей степени некорректно ,а насмешки над синтаксисом - просто унылы: ведь на вопрос

Где «логический тип» в С++?

я всегда смогу задать другой: где в java перегрузка операторов?

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

Совершенно верно: в простых языках, построенных на денотационной семантике, детали имплементации никого не интересуют, с ними разбираются компиляторостроители; а вот в сложных, построенных на операционной семантике, нужно рассказать каждую мелочь, а то запутаются. О том-то и речь, балбесина.

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

Не нужно.

Не нужно тратить ресурсы по отдельный тип, если его можно заменить интом. на самом деле в общем случае конечно, нужно, это я так - для поддержки разговора

За перегруженные операторы вообще нужно расстреливать.

4.2 Почему я не могу для своего операций со своими типами данных перегрузить оператор сложения, дабы дальнейшее использование не загромождало код вызовом какого нибудь метода или функции, и вообще, выглядело бы логично?

бери Scala.

Эх как у вас все легко: бери что хочешь, пиши что хочешь :) . А если надо поддерживать 50к строк кода java ee? Не переводить же мне весь проект на скалу. Да и вообще, не так оно развита, как ванильная java, потому не надо прикрывать минусы языка различными форками

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

Совершенно верно: в простых языках

Согласен: Haskell это самый простой язык программирования, проще только brainfuck)))

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

За перегруженные операторы вообще нужно расстреливать.

Почему тогда у java.lang.String перегружен operator+?

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

Открываем раздел типов:

То есть вроде бы открывал, но:

А по Haskell это просто report (отчет о проделанной научной работе).

Кэп-то намекает, что это «ревизия языка». Названия глав с описанием грамматик должны были навести на кое-какие мысли.
Можно просто цитировать.

Такое ощущение, что вы скинули информацию не посмотрев даже.

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

За перегруженные операторы вообще нужно расстреливать.

Е-мае, ну и пишите себе на яве, на скале или хоть на вижуал бейсике. Не нравиться перегружать операторы, не нравиться приведение к bool - ну возьмите ЯП который полностью нравиться, 100500й плач Ярославны то зачем в девелопменте устраивать? Лавры прокодера что ли покоя не дают?

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

Не понял, о чем вы. Я открыл только после того, когда мне сказали, что по java описание больше, поэтому java сложнее. Так как знаком с обоими языками, то не мог себе представить как java можно было назвать сложнее haskell (это анекдот просто ну или толстый троллинг).

А смотрел здесь: http://www.haskell.org/onlinereport/haskell2010/

Что там не так с названиями глав?

После вашего поста заглянул в preface:

After several years exploring the design space, it was decided that a single monolithic revision of the language was too large a task, and the best way to make progress was to evolve the language in small incremental steps, each revision integrating only a small number of well-understood extensions and changes. Haskell 2010 is the first revision to be created in this way, and new revisions are expected once per year.


ОК, тогда если это не все зачем тыкать в то, что report по Haskell меньше чем specification по java? В чем логика?

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

тогда если это не все зачем тыкать в то, что report по Haskell меньше чем specification по java?

Не знаю, недостаточно разбираюсь в java, чтобы судить. Возражал конкретно по:

report (отчет о проделанной научной работе)

Все же report не в этом смысле, а «веха» процесса развития языка.

integrating only a small number of well-understood extensions and changes

Там же описаны не только изменения, а _с изменениями_. И «changes» насколько я понимаю - это адаптация расширений ghc haskell (в первую очередь) в ревизию стандарта.

По-моему аналогия со спецификацией допустима.

anonymous
()

Лето, солнце и вода - наши лучшие друзья. А не мерянье, которое гуглится длины пиписьки у ++ с жабами змеями и червями.

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

За перегруженные операторы вообще нужно расстреливать.

не нужно.

nanoolinux ★★★★
()

Скажи, а какой маргинальный у тебя gcc что в терминал вывелось только 2 единицы? gcc 4.6, 4.8 выдают 3 как и написано в коде.

Вот тут люди просят, присоединяйся http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55077

bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 1)

это проблема из си

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

рассмотрим такой код — разумно здесь конвертацию в bool сделать ровно наоборот

enum network_result_t { NET_SUCCESS=0, CAN_NOT_RESOLVE_HOSTNAME, NO_ROUTE_TO_HOST};

network_result_t r = do_something(....);
if( r ) { // тут разумно было бы 0 конвертировать в true
  printf("all ok\n");
}else{
  printf("error: ");
  ....
}

или вот — опять разумно здесь конвертацию в bool сделать ровно наоборот

char* result = do_something(....);
if( result ) { // тут разумно было бы NULL конвертировать в true
  printf("all ok\n");
}else{
  printf("error: %s", result);
  ....
}

ну и да — с чего они сделали true=1, а не 0xFFFFFFFF (по числу разрядов), мне не ясно

з.ы. еще одно якобы удобство из си — это арифметика указателей, и опять из-за своей некастомизируемости

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

В первом случае разумно было бы проверять так:

network_result_t r = do_something(....);
if( r == NET_SUCCESS) { 
  printf("all ok\n");
}else{
  printf("error: ");
  ....
}

Потому что никто не гарантирует что отсутствие ошибок - это 0. Есть именованные константы ошибок - будьте любезны использовать их.

Во втором случае комментарий не соответствует коду. У вас как раз и возвращается NULL в случае ошибки так то.

ну и да — с чего они сделали true=1, а не 0xFFFFFFFF (по числу разрядов), мне не ясно

0xFFFFFFFF - это тоже true, как и любое отличное от 0 число.

еще одно якобы удобство из си — это арифметика указателей, и опять из-за своей некастомизируемости

А что вы там в арифметике указателей кастомизировать собрались-то?

grondek
()

Приплюснутый растёт из простого С. А тот в свою очередь растёт из ассемблера PDP-11 (СМ-4). В ассемблере была команда TST и переходы BEQ/BNE.

Вот с тех пор, всё что не ноль канает за истину.

a0512
()

LongLiveUbuntu познает C++. Часть тертья.

П.С. Ждем твоих ненавистных постов о темплейтах и виртуальных функциях.

trex6 ★★★★★
()

И это мейнстримный язык. В мейнстриме обычно полно костылей.

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