я говорил не про это. Я говорил про смешивание стилей. Поясню: ИМХО можно писать "на С++ в процедурном стиле", в этом ИМХО нет ничего плохого, это НЕ быдлокод. Но это, ИМХО, и не С++. Быдлокод, это когда вы пишете в процедурном стиле, а потом внезапно впихиваете в качестве параметра функции объект класса с виртуальными методами. Вот это -- быдлокод. Или когда у вас публичный виртуальный метод принимает указатель void* непонятно на что(даже если вам оно и понятно, то это всё равно быдлокод, ибо засунуть в такой метод можно всё что угодно).
Учу Си, посоветуйте куда устроиться получше. (Лучшая работа, Си)
Модераторы: Hoblin, Модераторы разделов
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
я говорил не про это. Я говорил про смешивание стилей. Поясню: ИМХО можно писать "на С++ в процедурном стиле", в этом ИМХО нет ничего плохого, это НЕ быдлокод. Но это, ИМХО, и не С++. Быдлокод, это когда вы пишете в процедурном стиле, а потом внезапно впихиваете в качестве параметра функции объект класса с виртуальными методами. Вот это -- быдлокод. Или когда у вас публичный виртуальный метод принимает указатель void* непонятно на что(даже если вам оно и понятно, то это всё равно быдлокод, ибо засунуть в такой метод можно всё что угодно).
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
если вы не знаете хорошо какой-то скриптовый ЯП вроде bash/perl, и/или вы не можете уверенно писать программы на ФП(CL к примеру) -- вон из профессии. Из вас может получится отличный художник или инженер. Или дворник. Я не знаю. Но точно -- не программист.
если вы не знаете ассемблер == вы не читали Кнута. Вон из профессии.
если 100 для вас "не красиво", а 2^2-1 -- "красиво", вон из профессии. Число "3" -- ущербное. Если при написании кода у вас появляется число 3 -- значит вы что-то сделали не так. (возможно конечно, что это не баг, а фича. Тогда вы -- гениальный программист :)
м... Это уже какая-то политэкономика. Вы меня извините, но эти лекции я благополучно проспал в своё время. Возможно вы правы.
NickLion писал(а): ↑28.10.2013 05:24drBatty, если я его правильно понял, говорил о смешении в одом коде разных подходов, например, обычных указателей и ручного удаления, умных указателей, строк char* и std::string, и др. В таком виде я согласен, это обычно быдлокод. Но не использование процедурного стиля в C++.
именно так.
Re: Учу Си, посоветуйте куда устроиться получше.
Будете юзать static_cast или C-Style?
Если первое, то вам не кажется, что это уже концепция C++, а не C?
Если второе, то как будет бороться с тем, что преобразование в C и C-Style в C++ немного различаются? Гонять всё в void* и обратно?
Тогда это получиться не "писать на С++ как на С", а "использовать С++ без классов, шаблонов и STL". ИМХО это так же глупо, как в Haskell писать всё в монаде IO или в Дельфях весь функционал снести в 1 функцию.
А ещё в С+11 есть возможности для функционального программирования. Только вот писать в функциональном стиле никто не будет. Потому что это так же глупо.
Да кроме Prolog особо распространённого ничего и нет.
Я согласен, что можно было включить, если бы не один факт: логические и функциональные ЯП очень похожи, т.к. используют одну концепцию. Только в ФЯП программа описывается как z_1, ... , z_n = f(x_1, ... , x_m), а в ЛЯП -- как F(x_1, ... , x_m, z_1, ... , z_n)=0. Именно поэтому ЛЯП и любят скрещивать с ФЯП.
В char* лежит не число, а указатель размером с указатель ^_^
Причём это указатель именно на строку, а не на что-то другое.
Естественно. Ведь это может быть вторая, третья и т.п. буквы. Но в любом случае это будет строка.
Данные, на которые указывает char*, компилер будет интерпретировать именно как строку, причём оканчивающуюся именно нулём, но без указания кодировки. А ваше мнение компилеру как-то не интересно.
Вот именно! Не программист, а кодер. Не художник, а маляр. Но как я говорил, маляры тоже нужны.
И наоборот, если вы читали Кнута и знаете MIX/MMIX-асм, то вы не знаете асм. Такие дела.
Re: Учу Си, посоветуйте куда устроиться получше.
Второе. Немного различается лежит в области множественного наследования, его не будет, так что и проблем не будет.
sciko писал(а): ↑28.10.2013 21:07Тогда это получиться не "писать на С++ как на С", а "использовать С++ без классов, шаблонов и STL". ИМХО это так же глупо, как в Haskell писать всё в монаде IO или в Дельфях весь функционал снести в 1 функцию.
А ещё в С+11 есть возможности для функционального программирования. Только вот писать в функциональном стиле никто не будет. Потому что это так же глупо.
Это не глупо. Это нормально. ООП иногда излишне и процедурный стиль вполне покрывает задачи. Да, я согласен, что в таком случае стоит писать на "чистом" C, но если приходится взаимодействовать с C++ библиотекой, я возьму C++ и напишу на нём в процедурном стиле. И совсем не буду чувствовать себя глупо.
Нет, это указатель на символ, а не на строку. Но так как в C/C++ любой указатель одновременно можно понимать как указатель на последовательность, то его можно понимать как строку. Например, null-terminated строку. Впрочем, не обязательно.
Re: Учу Си, посоветуйте куда устроиться получше.
Это указатель на целое число размером 8 бит (можно занявшись буквоедством оспорить размеры типов, но это не суть). В этом целом числе может лежать ASCII символ или что угодно другое. Строка - лишь абстракция последовательности целых чисел, представляющих ASCII символы.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
что-то вы ерунду какую-то городите:
Код: Выделить всё
char x = 17;// маленькое целое число
char *p = &x;// указатель на маленькое целое число
(*p)++;// 17+1=>18
p[0]++;// ещё это массив из одного эл-та.
тип char это тот же int, единственная разница между ними, что у char'а размер ==1 по определению, а у int'а размер не определён, известно лишь что он не меньше char'а, и обычно это родной размер данной архитектуры(но не всегда, например в amd64 сейчас не так).
А char* -- указатель на целое число char, и не более того. А безусловные "строки" живут только в вашей фантазии.
у меня выше никакая не строка. А число 17.
ЯННП
такие -- не нужны. Ну во всяком случае C/C++ не для них. Есть ведь php/C#.
бред какой-то. MIX -- это типичный ассемблер. Как можно знать ассемблер, и не знать ассемблер одновременно? Или вы сейчас к словам придираетесь, и про MIXAL говорите?
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
правильнее сказать: последовательность _чисел_ типа char. То, что ваша программа интерпретирует данные числа как какие-то символы какого-то алфавита -- это трудности исключительно вашей программы, и к C не имеет отношения. Как и то, что _вы_ считаете концом строки символ '\0'. Библиотечные функции могут как следовать таким соглашениям(strcmp(3)), так и НЕ следовать (memcmp(3)). Ну и конечно strcmp(3) сравнивает на самом деле ЧИСЛА, а вовсе не строки. Это только из-за правильного выбора ASCII можно считать последовательности char'ов -- строками.
Re: Учу Си, посоветуйте куда устроиться получше.
Да, конечно. Символ, как тип данных = код, число. А не глиф, и даже не символ в какой-то кодировке. Это же не Java.
Да, насчёт необязательности null-terminated я говорил. В той же std::string имеется char*, но указывает он не на null-terminated строку: длина хранится отдельно.
Вот здесь, немного мимо, memcpy использует void*.
Re: Учу Си, посоветуйте куда устроиться получше.
Т.е. "символ в какой-то кодировке" -- это уже не число? А что, по-Вашему? Кодировка (совместно со шрифтами) для того и нужна, чтобы представлять символы (глифы) в виде чисел (однобайтовых или многобайтовых)
А в ней что не так? Там единственная особенность: для символов внутри JVM всегда используется одна кодировка (UTF16) и она нигде не указывается -- указывается (или берётся системная по-умолчанию) только входная и выходная при всевозможных операциях ввода-вывода (например, при генерации строки из массива байтов и наоборот). А сами символы (переменные char и их массив в String) -- вполне себе числа
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
на самом деле это char. В качестве доказательства посмотрите на число этих void*. Как известно, размер void* не определён, но memcpy обрабатывает вполне определённое количество этих void*. Равное числу char'ов. Тип void* там только для удобства, что-бы вручную не преобразовывать скажем int* -> char*.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
с т.з. ЯП C/C++, не существует никаких особых "символов", кроме чисел типа char.
Т.е. никаких "строк" не существует, а существуют лишь массивы из целых чисел, которые могут быть использованы как "строки". Причём даже два вида таких массивов есть: типа char, и типа wchar_t, которые в gcc трактуются сейчас как целые числа в 32 бита. Конечно, вы можете трактовать как строки что угодно, например массив 64х целых чисел, в каждом из которых лежит ровно 8 символов ASCII. Но и то, и другое, и третье, это всё ваши допущения. С т.з. C/C++ нет никакой разницы, "символ" это или "число". Машинный код не изменяется от того, что вы будете считать char'ы не буквами, а числами. Компилятор этого не только не учитывает, но и не может знать, и соответственно учитывать. Т.е. компилятор обрабатывает char* как указатель на число(на числа).
Re: Учу Си, посоветуйте куда устроиться получше.
#include <stdio.h>
int main (void) {
int mask = (1 << 1) | (1 << 0);
printf("%d ... oops!\n", mask);
return 0;
}
[x] close
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
что-то вы сделали не так...
Да и вообще непонятно, что и комы вы хотели доказать? Для меня и компилятора ваша строчка эквивалентна
Код: Выделить всё
int mask = 3;
Re: Учу Си, посоветуйте куда устроиться получше.
видимо оттого что вы с битовыми операциями дел не имели...
;)
[x] close
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
Re: Учу Си, посоветуйте куда устроиться получше.
Полностью согласен. С т.з. ЯП Java, как ни странно, тоже.
Я только не смог понять, что имел ввиду NickLion в утверждении "Символ, как тип данных = код, число. А не символ в какой-то кодировке." Из этого следует, что символ в какой-то кодировке не есть число (а что?)
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
спор был вот с этим ложным утверждением:
так вот в char*p лежит именно число. Т.е. в том смысле, что тип *p == целое число, обычно из диапазона -128..127. Размер (в смысле sizeof) данного числа по стандарту равен 1(единица). Да, его можно интерпретировать как "символ", и как "первый символ строки ASCIIZ". Но эта интерпретация к самому ЯП не относится. Разве что к некоторым функциям из стандартной библиотеки. Кодировки тут наверное при том, что в отличных кодировках от ASCII, не ASCII символы больше 127, но как известно, в 99.999% случаев, тип char никогда не принимает значения >127. Т.е. строго говоря, даже в какой-нить KOI8-R, символ "ф" НЕ имеет отображения в char(это связано с тем, что константы в C/C++ имеют тип int, в том числе и символьные). Ну и кроме того, "я" < "а", т.е. сортировка по алфавиту тоже поломана.
Re: Учу Си, посоветуйте куда устроиться получше.
Я имел в виду, что это число не связывается стандартом языка с каким-либо определённым символом. Данную связь и определяет кодировка. На PC 48 — это '0', а на другой машине может быть совершенно другое.
А вот и нет. Java определяет использование Unicode. Поэтому 48 там всегда '0'.
Правильнее говорить null-terminated, потому что ASCIIZ подразумевает null-terminated ASCII. А вот C ничего не говорит об ASCII.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
ну ASCIIZ говорит как раз об nul-terminated
Re: Учу Си, посоветуйте куда устроиться получше.
Да, но ASCIIZ неверно. Потому что может быть не ASCII. ASCIIZ — всегда null-terminated, но не всегда null-terminated — ASCIIZ. Например, в Linux мы часто используем UTF-8-Z (если можно так назвать). А eddy, наверное всё ещё KOI8-R-Z. Но даже эти кодировки частично совместимы с ASCII, что в общем случае всё равно не так.
Re: Учу Си, посоветуйте куда устроиться получше.
хм... может быть тогда разъясните, что же все же ущербно - Ваше "число 3" или Ваше "наоборот"?
[x] close
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
deadhead
ну начнём с того, что число 3 таки ваше. Уже вы за него должны ответить.
ну вы ведь его написали, или я что-то путаю?
ну начнём с того, что число 3 таки ваше. Уже вы за него должны ответить.
ну вы ведь его написали, или я что-то путаю?
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
deadhead
что вы этим хотите сказать?
что вы этим хотите сказать?
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
deadhead
что касается тройки, оно просто так из ниоткуда не появляется. Скорее всего, вы это число взяли "от балды", что конечно характеризует качество вашего кода.
Но совсем плохо, если число не просто от балды, а ещё и зачем-то замаскировано битовыми операциями. Т.е. это место в вашей программе не просто быдлокод, а хорошо замаскированный быдлокод, который так вот сразу и не заметишь.
Я пишу так:
И вместо 3 я обычно беру что-нить более оригинальное, например одну третью, она очевидно в целых числах равна 0x55555555. Но лучше 1/7, которая 0x24924924.
что касается тройки, оно просто так из ниоткуда не появляется. Скорее всего, вы это число взяли "от балды", что конечно характеризует качество вашего кода.
Но совсем плохо, если число не просто от балды, а ещё и зачем-то замаскировано битовыми операциями. Т.е. это место в вашей программе не просто быдлокод, а хорошо замаскированный быдлокод, который так вот сразу и не заметишь.
Я пишу так:
Код: Выделить всё
int x = 3;// TODO в этом быдлокоде я задаю x равным трём
// ибо точно не знаю, чему оно должно быть равно
И вместо 3 я обычно беру что-нить более оригинальное, например одну третью, она очевидно в целых числах равна 0x55555555. Но лучше 1/7, которая 0x24924924.
Re: Учу Си, посоветуйте куда устроиться получше.
ну так не имея элементарно опыта работы с битовыми операциями не мудрено не заметить... ;)
ага... для теста младших двух бит самое то! браво, маэстро!! ;)
впрочем
[x] close
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
т.е. вы признаёте, что цель быдлокода == обман?
теперь подумайте, КОГО вы обманываете?
уж если обмазываться битами, то всеми 32я или сколько там их у вас... А юзать пару битов из 32х как-то не очень экономично ИМХО. Ну и потом, ваши 1,1 ничем не лучше и не хуже моих 0,0.
Re: Учу Си, посоветуйте куда устроиться получше.
если, уважаемый читатель, не в силах осознать написанного ввиду отсутствия необходимых знаний, а тем более и опыта, то все в его глазах будет выглядеть "быдлокодом" и "ущербным"... обманывает, к сожалению, читатель только себя, ибо принимает свое мнение как истинно верное, но страшно не это ..страшно когда такой читатель начинает поучать окружающих - выдавая свое "ущербное" мнение за "авторитетное" с далеко идущими выводами...
а кстати, сколько? какого Ваше экспертное мнение? ;)
а что об этом думает, скажем, компилятор? :)
[x] close
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Учу Си, посоветуйте куда устроиться получше.
вы передёргиваете. Возмём другой пример быдлокода: когда вы вместо ВСЕГО используете goto. Т.е. ВСЕ циклы/условия/функции вы делаете через goto. Очевидно, что данный быдлокод будет невозможно прочитать. Вы мне тоже скажите на мои претензии: "учи матчасть, ламо! goto часть стандарта C!", так?
Можно долго спорить на тему, что можно, а что нельзя, и только одно очевидно: всякие goto и обмазывание битами сильно снижает читаемость программы. Да, иногда это всё даёт какой-то профит. Иногда даже читаемость повышает
Вот например в вашем случае
Код: Выделить всё
int mask = (1<<1)|(1);
do{
x &= mask;
mask <<= 2;
mask |= (y1<1)|y0
}while(...);
в данном примере переменная mask на самом деле == две переменные, это y1 и y0. Потому есть смысл и инициализировать y1,y0, но можно и сразу mask вот таким вот способом. Ибо это не тройка, это две битовые переменные, обе true.
deadhead писал(а): ↑01.11.2013 10:36то все в его глазах будет выглядеть "быдлокодом" и "ущербным"... обманывает себя, к сожалению, читатель, ибо принимает свое мнение как истинно верное, но страшно не это ..страшно когда такой читатель начинает поучать окружающих - выдавая свое "ущербное" мнение за "авторитетное" с далеко идущими выводами...
я просто по опыту знаю. Опыт у меня большой. Тупо по времени. Про тройки -- чисто эмпирическое знание. Оно не выводится из теории, а только из практики. Такого рода опыта и правил даже обезьяна нахватается, если её заставить читать МНОГО кода. Т.ч. моей заслуги тут немного.
не определено. Таково моё экспертное мнение по данному вопросу. Вы ещё на ноль попросите меня поделить. А лучше не меня, а любого математика, с тем понтом, что "да ты г-но, а не математик!".
компилятор об этом ничего не думает. Он думать не умеет. За то умеют думать разработчики компилятора. Так вот, их мнение просто(касаемо gcc) -- если программист хочет по два бита обрабатывать, то значит есть какой-то особый резон на то. И значит НАДО делать так, и никак иначе. Может это прототип, который так легче отлаживать? А может у программиста _всего_ два бита, и ему параллельно? Так тоже бывает. Однако, в обоих этих случаях обычно берут тип int, который тоже работает как двух битовая переменная. Причём без всяких обмазываний битовыми операциями. Вы можете проверить этот момент, выражение y1*2 + y0 работает точно также, как выражение y1<<1 | y0. Ну и зачем тут сдвиг и операция ИЛИ? Как раз тут случай преждевременной оптимизации, о которой писал Кнут: компилятор сам поменяет умножение на сдвиг, если на целевой платформе это быстрее (что, кстати говоря, далеко не факт)
Re: Учу Си, посоветуйте куда устроиться получше.
Вы уходите от первоначальной линии - утверждению что "число 3 ущербно". У меня нет никакого желания опускаться до обсуждения абстрактного "быдлокода", кое вы пытаетесь мне навязать.
так отчего же вы столь же экспертно заявляете
? ;)
ну просто безапелляционный аргумент... простите, но больше чем у кого? в чем? и причем тут время? ;)
ну так в чем экономия-то?
[x] close