C++ (программистское)
Mar. 15th, 2004 10:21 pmПроверьте себя: сумеете ли вы правильно ответить, не запуская, что должна напечатать эта программа:
Я вот не смог, ошибся в одном месте. Значит ли это, что я не помню C++? Наверняка. Я много лет не писал на нём (в отличие от C, на котором пишу время от времени). Но знаете что? я пока не соскучился.
Нафиг, нафиг. Java, C#, да что угодно пусть придёт, но от этого плюсплюсного конгломерата сложных и плохо продуманных синтаксических сталагмитов пора избавляться.
Хотите ещё один курьёз? Пожалуйста. Вот такой код:
что напечатает?
Думаете, "x=101 y=101"? А вот и нет. Он напечатает "x=1 y=101". Угадайте почему.
Когда кто-то писал комментарий, в конце строки вопросительных знаков случайно отпустил shift, и получил слэш. А ??/ — это триграф, обозначающий бэкслэш, т.е. \, и этот \ съедает следующий за ним \n, и делает строку ++x; частью комментария.
Про триграфы можно прочитать здесь. Там же про диграфы есть. Вы знаете, что в C++ можно использовать "and" и "or" вместо && и ||? Я не знал.
Да, кстати, правильные ответы и объяснения по поводу первого куска кода есть здесь. Там же есть ещё много сложных вопросов и мини-статей по синтаксису и возможностям C++.
#include <iostream>
#include <complex>
using namespace std;
class Base {
public:
virtual void f( int ) {
cout << "Base::f(int)" << endl;
}
virtual void f( double ) {
cout << "Base::f(double)" << endl;
}
virtual void g( int i = 10 ) {
cout << i << endl;
}
};
class Derived: public Base {
public:
void f( complex<double> ) {
cout << "Derived::f(complex)" << endl;
}
void g( int i = 20 ) {
cout << "Derived::g() " << i << endl;
}
};
void main() {
Base b;
Derived d;
Base* pb = new Derived;
b.f(1.0);
d.f(1.0);
pb->f(1.0);
b.g();
d.g();
pb->g();
delete pb;
}
Я вот не смог, ошибся в одном месте. Значит ли это, что я не помню C++? Наверняка. Я много лет не писал на нём (в отличие от C, на котором пишу время от времени). Но знаете что? я пока не соскучился.
Нафиг, нафиг. Java, C#, да что угодно пусть придёт, но от этого плюсплюсного конгломерата сложных и плохо продуманных синтаксических сталагмитов пора избавляться.
Хотите ещё один курьёз? Пожалуйста. Вот такой код:
#include <iostream>
#include <complex>
using namespace std;
int main() {
int x=1, y=1;
for( int i = 0; i < 100; ++i ) {
++y;
// What will the next line do? Increment???????????/
++x;
}
cout << "x=" << x << " y=" << y <<endl;
return 0;
}
что напечатает?
Думаете, "x=101 y=101"? А вот и нет. Он напечатает "x=1 y=101". Угадайте почему.
Когда кто-то писал комментарий, в конце строки вопросительных знаков случайно отпустил shift, и получил слэш. А ??/ — это триграф, обозначающий бэкслэш, т.е. \, и этот \ съедает следующий за ним \n, и делает строку ++x; частью комментария.
Про триграфы можно прочитать здесь. Там же про диграфы есть. Вы знаете, что в C++ можно использовать "and" и "or" вместо && и ||? Я не знал.
Да, кстати, правильные ответы и объяснения по поводу первого куска кода есть здесь. Там же есть ещё много сложных вопросов и мини-статей по синтаксису и возможностям C++.
no subject
Date: 2004-03-15 12:25 pm (UTC)no subject
Date: 2004-03-15 12:46 pm (UTC)В C# и Java, не думая, тоже можно много чего наворотить.
А ничего подобного тому, что сейчас можно делать на C++ вообще, не говоря уж об элегантности нового кода и производительности, сделать на них просто нельзя.
По крайней мере, до нормального появления в них шаблонов, да и дальше, я так чувствую -- они заметно хуже продуманы, мне кажется.
no subject
Date: 2004-03-15 12:48 pm (UTC)no subject
Date: 2004-03-15 01:08 pm (UTC)И шаблоны - это именно то что доктор прописал. Попробуйте на досуге отладить чужой код, написанный с интенсивным применением шаблонов. Будет Вам просветление, в самом лучшем виде.
Маму родную не узнаете.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Шаблоны в Java -- не дождетесь
From:Re: Шаблоны в Java -- не дождетесь
From:(no subject)
From:yep.
From:Опять 25..
From:Re: Опять 25..
From:guns don't shoot people in the foot
From:Re: guns don't shoot people in the foot
From:матчасть учить надо!!!!
From:(no subject)
From:Re: матчасть учить надо!!!!
From:Re: матчасть учить надо!!!!
From:Re: матчасть учить надо!!!!
From:Выучить доку по С++ дело нехитрое.
From:no subject
Date: 2004-03-15 12:57 pm (UTC)no subject
Date: 2004-03-15 01:04 pm (UTC)Что до 1-го примера, то было бы интересно услышать, как должен выглядеть язык, в котором пример, подобный приведенному, не вызовет проблем с пониманием у человека, слегка подзабывшего "закоулки".
Или, переиначивая вопрос, скажем, почему проблемы, подобные приведенным в первом примере, не возникают в тех же C# или Java?
no subject
Date: 2004-03-15 01:19 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 01:18 pm (UTC)С gcc 2.95.3 фокус не прошел. Сказало "x=101, y=101". В исходнике последовательность пердставлена как "3f 3f 3f 2f 0a 20 20", т.е. вроде бы все с начальным условием задачи совпадает.
no subject
Date: 2004-03-15 01:41 pm (UTC)(no subject)
From:no subject
Date: 2004-03-15 02:06 pm (UTC)Типа g++ -o foobar -trigraphs foobar.cc
(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 01:27 pm (UTC)Что вообще хорошего можно сказать про язык, в котором обычная переменная по умолчанию передаётся по значению, а массив - по адресы, и более того, где массив вообще, не изъёбываясь специально, нельзя передать по значению, а только по адресу и можно. Прямая дорога к отладочному аду. Мне кажется, одного этого достаточно, чтобы с ним не связываться, если есть хоть малейшая возможность.
no subject
Date: 2004-03-15 01:55 pm (UTC)Так массив же -- это просто указатель, так что здесь все логично. Хотите семантику по значению -- std::vector к вашим услугам.
(no subject)
From:В таком случае
From:Re: В таком случае
From:Re: В таком случае
From:Re: В таком случае
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Дружище, это ты пальцем в небо попал.
From:Re: Дружище, это ты пальцем в небо попал.
From:Цитата
From:Re: Цитата
From:no subject
Date: 2004-03-15 01:57 pm (UTC)> переменная по умолчанию передаётся по значению, а массив - по адресы
А как ещё это можно сделать, принимая во внимание основную парадигму языка: быть как можно ближе к железяке? Это уж Природа так диктует. Это как и с векторами, меняющими размер: только два таких можно расположить в памяти, не мудрствуя лукаво насчёт её, памяти, управления, а просто расположив их по краям и дав расти друг навстречу друга.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 01:30 pm (UTC)К слову сказать, для обектно-ориентированного программированя простой C подходит гораздо больше, чем C++.
Мне нравятся языки, похожие на песок, из которого можно построить замок любой красоты, а не набор уродливо выточенных эклектически подобранных блоков.
Я не понимаю, почему люди почти всегда игнорируют простое и красивое, а выбирают для пользования всякую дрянь. Ведь это не только в программировании, это, похоже, во всём...
no subject
Date: 2004-03-15 01:58 pm (UTC)И как на с полиморфизм писать? Запонять в ручную vtables как в GTK? Нет уж, спасибо...
Насчет языков програмирования - нету языков универсальный и идеальных. Каждой задаче - свои языки.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Каждый кулик...
From:Re: Каждый кулик...
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 01:58 pm (UTC)no subject
Date: 2004-03-15 02:14 pm (UTC)Слишком bloated язык получился. Ну уж очень.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 02:18 pm (UTC)действительно: то, что компилятор сначала попытается откастить вызов для всех возможных оверлоадов наследника, и лишь потом перейдет к родителю - не самый известный факт. кстати, кто может тыкнуть на соответствующее место в ISO?
no subject
Date: 2004-03-15 02:48 pm (UTC)Ошибся я в последней строке, т.к. не помнил, что дифолтные значения берутся из базового класса, даже если вызывается виртуальная функция наследника. На самом деле это просто, если подумать немного (ясно же, что это во время компиляции происходит), но я не подумал ;)
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 02:22 pm (UTC)значит я похвастаюсь :)
а вот со вторым у меня сперва не вышло -- точнее, напечаталось "101, 101."
и только --ansi смог заставить g++ получить описанный результат.
no subject
Date: 2004-03-15 03:37 pm (UTC)> продуманных синтаксических сталагмитов пора избавляться
Забавно, как даже такие казалось бы нетривиальные люди как avva так банально реагируют на непонимание - "избавляться". Не нравится язык - не используй. Нет, нужно от него "избавляться"!
no subject
Date: 2004-03-15 03:41 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From: (Anonymous) - Date: 2004-03-15 03:59 pm (UTC) - Expand(no subject)
From:(no subject)
From: (Anonymous) - Date: 2004-03-15 04:13 pm (UTC) - Expand(no subject)
From:OT
From: (Anonymous) - Date: 2004-03-15 04:25 pm (UTC) - Expand(no subject)
From: (Anonymous) - Date: 2004-03-15 07:51 pm (UTC) - Expand(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-03-15 10:38 pm (UTC)no subject
Date: 2004-03-15 10:43 pm (UTC)(no subject)
From:no subject
Date: 2004-03-15 11:49 pm (UTC)У C++ есть неоспоримое преимущество: с ним не соскучишься.
Даешь голосование!
Date: 2004-03-16 12:37 am (UTC)Вчера, как только прочитал эту Вашу запись, я подумал, ну кто я такой, чтобы защищать С++, он и без меня справится. Выгораживать его не хочу. Однако, прочитав тред, свою долю флуда на эту тему непримену добавить:
1. Несмотря на то что C# мне очень по душе, до С++ ему еще надо подрасти: template'ы - грандиозная вещь, одни они чего стоят!
2. Эта уйма возможностей, тонкости, неожиданные аспекты - это-то как раз и обеспечивает его мощь и красоту.
А касательно вопросов: и триграфы/диграфы, и "and/or" введены не просто так, т.е. в тех языках где их нет, либо должно быть что-то другое, эквивалентное, либо не будем сравнивать их с С++.
И три/диграфы, и "and/or/xor/bitand/..." описаны у Срауструпа в 3 издании в приложении В "Технические подробности". Страус у многих программирующих на С++ всегда под рукой.
а известно ли благородному дону, что
Date: 2004-03-16 01:55 am (UTC)int i = 1;i += ++i + i++;
cout << i;
— даёт разные результаты в MS C++, g++ и SUN Java. Сиречь, буквально три различных результата.
Re: а известно ли благородному дону, что
Date: 2004-03-16 07:41 am (UTC)Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:Re: а известно ли благородному дону, что
From:(no subject)
From:no subject
Date: 2004-03-16 03:01 am (UTC)http://www.artima.com/intv/elegance2.html
Вы видели D (новейший из языков с таким названием), интересная штука, правда?
http://www.digitalmars.com/d/overview.html
Вот код на С, в некотором смысле аналогичный вашему первому примеру (я, кстати, ответил правильно, ну, ведь, сами подумайте, зачем Derived::g() печает ещё и аргумент ;-)) ):
void terrible( int i ) { switch( i ) { case 0: do { case 1: if( i ) { case 2:; } }while(i--); } }По поводу второго примера могу только поинтересоваться, зачем вам понадобились триграфы или почему вы пишете --ansi и не пишете -Wall?no subject
Date: 2004-03-17 02:13 am (UTC)no subject
Date: 2004-03-16 03:33 am (UTC)Уже сколько копий обломали.
ИМХО
Ассемблеры - Почему собаки лижут себе яйца ? Потому-что могут.... ;-) 99% программистов не может.
С - язык низкого уровня предоставляющий наибольшую гибкость но и требующий максимальной дисцыплины.
С++ - неудачная попытка продвинуть С на уровень обьектно-ориентированного языка
Objective C - удачная попытка продвинуть С на уровень обьектно-ориентированного языка. К сожалению не поддержана Мелкософтом и засим так и не ставшая популярной.
Лучшее доказательство мощи и легкости языка - NextStep и средства разработки для него.
Java/C# - С точки зрения языка - упрощенная версия Objective C. Именно он стал басисом для создания Java. А не С и не С++. Наиболее подходит для решения Хай-Левел задач. Совершенно не подходит для задач низкого уровня. Попытка Sun доказать что это не так посредством написания Java OS окончилась полным провалом
Visual Basic - это конечно не язык программирования пер-се. Но и нос воротить тоже не стоит. Как средство быстро и дешево разрабатывать небольшие программы с ГУИ, он идеален. а потому занимает свою нишу вполне заслуженно
Pascal - реальная жизнь - это не университет.
Ada - слишком тяжел для решения 95% задач. для решения 5% задач - весьма и весьма подходит.
Prolog - Кто-нибудь еще помнит Турбо-Пролог конца 80-х ? где-то на дискетке дома валялся вроде.
Modula-2/3/Oberon - реальная жизнь - это не университет. вторая серия. Хотя потенциал есть, никто почему-то не хочет.
Fortran/Cobol - До сих пор ????????
Forth - RPN anyone ? :)
вопрос - Как назывался язык из школьного учебника по информатике и выч. технике ? Я помнил но забыл.
no subject
Date: 2004-03-16 07:44 am (UTC)(no subject)
From:(no subject)
From: (Anonymous) - Date: 2004-03-16 10:58 pm (UTC) - Expand(no subject)
From:(no subject)
From:durazkie voprosy
Date: 2004-03-21 09:37 pm (UTC)Naji oshibki v kode (straniz dve, gde to).
Vot tut to i stanovitsa jasno, xorosho chelovek nastupait na grabli,
i nauchilo li ego eto chemu nebud'