По ссылке или по значению? Ключевое слово Знач и с чем его едят
Заранее извиняюсь за пафосную аннотацию про "расстановку точек", но надо же как-то завлечь вас в статью)) Со своей стороны постараюсь, чтобы аннотация все же оправдывала ваши ожидания.
Вкратце о чем речь
Все это и так знают, но все же в начале напомню, как в 1С могут передаваться параметры метода. Передаваться они могут "по ссылке" и "по значению". В первом случае, мы передаем в метод то же самое значение, что и в точке вызова, а во втором - его копию.
По умолчанию в 1С аргументы передаются по ссылке, и изменение параметра внутри метода будет видно извне метода. Здесь дальнейшее понимание вопроса зависит от того, что именно вы понимаете под словом "изменение параметра". Так вот, имеется в виду повторное присваивание и ничего более. Причем, присваивание может быть неявным, например вызовом метода платформы, который возвращает что-то в выходном параметре.
Но если мы не хотим, чтобы наш параметр передавался по ссылке, то мы можем указать перед параметром ключевое слово Знач.
Все работает, как обещано - изменение (а правильнее сказать "замена") значения параметра не приводит к изменению значения вне метода.
Ну а в чем прикол-то?
Интересные моменты начинаются, когда мы начинаем передавать в качестве параметров не примитивные типы (строки, числа, даты и т.п.), а объекты. Вот тут-то и всплывают такие понятия, как "мелкая" и "глубокая" копия объекта, а также указатели (не в терминах C++, а как абстрактные дескрипторы (handles)).
При передаче объекта (например, ТаблицыЗначений) по ссылке, мы передаем само значение указателя (некий handle), который в памяти платформы "держит" объект. При передаче по значению платформа сделает копию этого указателя.
Иными словами, если, передавая объект по ссылке, в методе мы присвоим параметру значение "Массив", то в точке вызова получим массив. Повторное присваивание значения, переданного по ссылке, видно из места вызова.
Если же, мы передадим объект по значению, то в точке вызова наша ТаблицаЗначений не пропадет.
Содержимое объекта и его состояние
При передаче по значению копируется не весь объект, а только его указатель. Экземпляр объекта остается одним и тем же. Неважно, как вы передаете объект, по ссылке или по значению - очистка таблицы значений приведет к очистке именно таблицы. Эта очистка будет видна везде, т.к. объект был один-единственный и неважно, как именно он передавался в метод.
При передаче объектов в методы платформа оперирует указателями (условными, не прямыми аналогами из C++). Если объект передается по ссылке, то ячейка памяти виртуальной машины 1С, в которой лежит данный объект, может быть перезаписана другим объектом. Если объект передается по значению, то указатель копируется и перезапись объекта не приводит к перезаписи ячейки памяти с исходным объектом.
В то же время любое изменение состояния объекта (очистка, добавление свойств и т.п.) изменяет сам объект, и вообще никак не связано с тем, как и куда объект передавался. Изменилось состояние экземпляра объекта, на него может быть куча "по-ссылок" и "по-значений", но экземпляр всегда один и тот же. Передавая объект в метод, мы не создаем копию всего объекта.
И это верно всегда, за исключением.
Клиент-серверное взаимодействие
В платформе очень прозрачно реализованы серверные вызовы. Мы просто вызываем метод, а под капотом платформа сериализует (превращает в строку) все параметры метода, передает на сервер, а потом возвращает выходные параметры обратно на клиента, где они десериализуются и живут, как будто ни на какой сервер не ездили.
Как известно, не все объекты платформы являются сериализуемыми. Именно отсюда растет ограничение, что не все объекты можно передать в серверный метод с клиента. Если передать несериализуемый объект, то платформа начнет ругаться нехорошими словами.
В стандартах разработки фирмы 1С рекомендуется всегда в параметрах использовать ключевое слово Знач, если мы не собираемся явно возвращать в параметре некое значение. Это хорошо по нескольким причинам:
- Явное объявление намерений программиста. Глядя на сигнатуру метода, можно четко сказать, какие параметры входные, а какие выходные. Такой код легче читать и сопровождать
- Для того, чтобы изменение на сервере параметра "по ссылке" было видно в точке вызова на клиенте, п араметры, передаваемые на сервер по ссылке, платформа обязательно будет сама возвращать на клиента, чтобы обеспечить поведение, описанное в начале статьи. Если параметр не нужно возвращать, то будет перерасход трафика. Для оптимизации обмена данными параметры, значения которых нам не нужны на выходе, нужно помечать словом Знач.
Здесь примечателен второй пункт. Для оптимизации трафика платформа не будет возвращать значение параметра на клиент, если параметр помечен словом Знач. Все это замечательно, но приводит к интересному эффекту.
Как я уже говорил, при передаче объекта на сервер происходит сериализация, т.е. выполняется "глубокая" копия объекта. А при наличии слова Знач объект не поедет с сервера обратно на клиента. Складываем эти два факта и получаем следующее:
Резюме
Если вкратце, то резюмировать можно следующим образом:
- Передача по ссылке позволяет "затереть" объект совсем другим объектом
- Передача по значению не позволяет "затереть" объект, но изменения внутреннего состояния объекта будут видны, т.к. идет работа с одним и тем же экземпляром объекта
- При серверном вызове работа идет с РАЗНЫМИ экземлярами объекта, т.к. выполнялось глубокое копирование. Ключевое слово Знач запретит копирование серверного экземпляра обратно в клиентский, и изменение внутреннего состояния объекта на сервере не приведет к аналогичному изменению на клиенте.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(4) tormozit, но не находите, что если вычленить суть, то какая-то бедненькая статья получается?
- Скопировать ссылку
- Перейти
Если очень условно, то виртуальная машина, которая выполняет скрипт 1С, имеет память в виде массива "значений" языка 1С. Ваша переменная, в которую записана, скажем ТаблицаЗначений, это на самом деле численная переменная. А число указывает на номер ячейки в том массиве памяти виртуальной машины. Так вот, когда вы передаете переменную по значению, то вот это число с номером ячейки (адрес) копируется в другую переменную и становится независимым (ее можно перезаписать другим значением, на исходную переменную это не повлияет). Сам объект в ячейке памяти с первоначальным номером никуда не девается и продолжает жить. Блин, сам запутался.
Есть таблица на стопицот тыщ строк. Ее можно передавать хоть по ссылке, хоть по значению - сами стопицот тыщ строк не копируются, копируется только адрес этой таблицы. А вот если мы передаем эту таблицу на сервер, то вся она копируется. Более того, если в серверном методе не было слова Знач, то вся она еще и обратно на клиента поедет.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(1) за мудрено пишите
передача параметра по значению = выделяется в памяти еще грубо говоря одна переменная, которой присваивается то же самое значение и код вызванного метода (процедуры/функции) использует в свое работе именно эту новую переменную, и не может попортить значение другой переменной. Однако так как, если в переменных лежит один и тот же мутабельный объект, то изменить его свойства вызванный метод вполне способен и тогда когда метод закончит свою работу, то вызвавший его ранее метод будет работать с уже измененным объектом внутри переменной, но сама переменная так и будет ссылаться на тот же объект, что был в ней изначально. С простыми типами типа Число, Булево, Строка. там все просто, в новой переменной вызванный метод может изменить только само значение новой переменной и это никак не повлияет на значение той переменной, что была использована в качестве аргумента для вызова метода.
передача параметра по ссылке = в том же паскале это означает, что передается адрес переменной в памяти без ее копирования и что любые манипуляции с этой переменной скажутся на значении этой переменной и когда вызванный метод завершит свою работу, то переменная может быть уже измененной до неузнаваемости
отдельная история с аргументами метода, которые являются константами, то есть например Sin(60), где 60 константа. хоть как их передавай, хоть как их меняй в вызванном методе, это не повлияет на код вызвавший этот метод, так как это не переменная и нигде значение далее не используется
1С не зло, просто нужно уметь готовить, упс. программировать понимая основы, это все в книжках описано по разным языкам программирования, разделы типа передача параметров в функции/процедуры/методы.
- Скопировать ссылку
- Перейти
(138) что мудрено? есть примитивные типы данных, а есть структуры данных (классы, объекты). Я не знаю как в 1С, но в Java хранятся они в разных областях памяти. Для манипулирования объектом используются указатели. При присвоении значения новой переменной, новая переменная содержит указатель на ту же область памяти. И я могу манипулировать данными объекта. Пример: Var1 = new MyObject(); Var1.doSomething(10);
Var2 = Var1; Var2.doSomething(12);
В 1С же, когда передается по значению, уверен, что происходит создание копии передаваемого объекта и область видимости ограничивается методом, в который был передан объект. Т.е. создается еще один объект.
Константы в переменных 1С как таковые отсутствуют, т.к. для работы констант нужно использовать Константы.ИмяКонстанты.
- Скопировать ссылку
- Перейти
(139) Постольку поскольку в 1С нет жесткой типизации данных, то можно говорить, что там вообще один единственный тип данных Variant и хранятся данные возможно вообще все в куче, но это не точно, да и не важно где они хранятся, зачем прикладному программисту так много знать о том что завтра может уже работать и по другому.
По поводу передачи параметра типа Структура и еже с ними по Значению, то происходит передача ссылки в новой переменной, и по этой переменной и хранящейся в ней ссылке обращаемся все к той же структуре. Чтобы получить копию структуры, нужно явно создать второй ее экземпляр и перегнать все значения из одной в другую, при этом если значения тоже сложные структуры и нужны и их копии. то нужно и их вручную таким же дебильным методом копировать.
В своей практике программирования на 1С вообще не приходится сталкиваться с тем чтобы так клонировать данные в памяти. В мире того же C# есть свои танцы с бубноми по теме клонирования объектов и там это решается по своему гуглите "Копирование объектов. Интерфейс ICloneable".
- Скопировать ссылку
- Перейти
(147) Парни, ну вот вы нашли друг-друга то.
1С НИЧЕМ не отличается от С++ и C# в части передачи значений в методы. От Java тоже ничем не отличается, только в Java нет передачи по ссылке, поэтому все идет "по значению". Если в Java вы передали List в метод, то этот ТОТ ЖЕ САМЫЙ List и никакой копии его не происходит. Создайте в Java List на миллиард записей размером по килобайту. А теперь передайте этот List в какой нибудь метод. Заметна потеря времени на "копирование при передаче по значению"? Нет, т.к. никакого копирования нет, передается только указатель. Но передается он "по значению", т.к. нельзя заменить значение, лежащее в этом указателе, так, чтобы это изменение было видно за пределами метода.
Итого: 1С работает строго так, как все другие известные мне языки, имеющие методы и параметры в них. Не выдумывайте того чего нет, почитайте еще раз статью, там как раз про мелкие и глубокие копии написано. Подумайте еще раз над термином и погуглите его, а после, не ведите споров о том, в чем разбираетесь поверхностно.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Вопрос: если на сервере создать функцию, возвращающую новый экземпляр объекта, получу ли я таким образом копию, например, структуры?
КодПоказать полностью
Вот что выдаст "Сообщить": два или пять?
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Ничего не понял
. указатель копируется и перезапись объекта не приводит к перезаписи ячейки памяти с исходным объектом.
Получается два указателя на один и тот же объект? Как тогда по по одному указателю модифицируем объект а по второму указателю получаем немодифицированный объект?
Так что всетаки копируется ? Указатель на объект или создается копия объекта? Разьясните плиз
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Вот к чему приводит разделение на сервер и клиент, простые понятия уже не так просто объясняются.
Жесть какая-то в будущем будет, прогнозирую управляемое разделение на вызов нескольких серверов.
типа когда можешь управлять на каком сервере будет исполняться код в кластере серверов)
- Скопировать ссылку
- Перейти
А многопоточность в 1С 8.3 есть ?
Чтобы можно было так написать
thread1.Start(); thread2.Start(); thread3.Start(); thread4.Start();
thread1.Wait(); thread2.Wait(); thread3.Wait(); thread4.Wait();
Сообщить("Шеф, усё готово!");
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Это тоже самое, с точки зрения получаемого результата, что и:
Ну или такое копирование можно представить перед вызовом:
Т.е. в случае использования ключевого слова "знач" платформа просто создает новую переменную и в нее копирует значение, вот так "КопияЗначения=Значение", и именно с этой копией вы работаете внутри процедуры. Это конечно не относится к особенностям ключевого слова "знач" при передачи управления с &НаКлиенте на &НаСервере и обратно.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Другими словами, в 1С есть примитивные и ссылочные типы данных. Примитивные (базовые) типы содержат непосредственно значения, ссылочные содержат ссылки (указатели) на данные. При вызове процедуры/функции без изменения контекста, при передаче параметров по значению:
- для примитивных типов копируется значение переменной и в процедуре мы получаем полную копию аргумента процедуры, никак после входа в процедуру уже не связанную с аргументом, указанным при вызове, соответственно все манипуляции с переменной в теле процедуры не оказывают ни какого влияния на переменную, использованную в качестве аргумента при вызове процедуры.
- для ссылочных типов копируется значение переменной и в процедуре мы получаем полную копию аргумента процедуры, который фактически является указателем на данные переменной-аргумента, указанного при вызове, соответственно в теле процедуры мы можем получить доступ свойствам и методам исходной переменной также, как и при передаче этого параметра по ссылке, т.е. эти 2 варианта сработают абсолютно одинаково:
Но это только до тех пор, пока мы не изменим саму переменную, при передаче параметра по значению, для ссылочного типа, с этого момента мы просто потеряем доступ к данным исходной переменной:
и для закрепления
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Так всё же, как сделать много потоков на сервере для вычисления? Предположим задача такая - есть массив товаров и их много. нужно запустить в "Х" потоков расчет количества документов отгрузки, в которых товар присутсвует за период Для разных процессов можно разбить по товарам, можно по периодам, результат должен быть помещен в оборотный регистр. как это сделать ? пример может кто-то сделать? "Х" - задается на входе в функцию фабрику потоков.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
А вот ведь интересная штука высветилась на тему копирования структуры. Оказалось, что при обходе в цикле с вставкой нового ключа структуры работает быстрее, чем при использовании "изСтрокиВнутр()".
Вот такой был пример: КодПоказать полностью
В первом случае у меня было 15 136 мс, во втором - 15 789 мс = на 650 мс больше. При меньшем размере структуры (3 записи) результат повторяется в пользу цикла с вставкой элемента структуры по ключу. У вас также? Версия платформы 8.3.5.1248.
- Скопировать ссылку
- Перейти
Это называется "в пределах погрешности измерений" )
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(32) вот сделал 4 теста, время такое:
1. 15 164 15 460
2. 14 665 15 398
3. 15 132 15 288
4. 15 132 15 662
Понятно, что загрузка сервера "плавающая", но ВСЕГДА второе выполняется дольше первого.
- Скопировать ссылку
- Перейти
(32) а вот для 1 000 000 итераций:
149 684 155 643
Сразу все стало ясно - "в строку - из строки" выполняется медленнее, чем создание новой структуры и добавление в нее данных в цикле.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(38) (41) Я бы не стал использовать ЗначениеИзСтрокиВнутр И ЗначениеВСтрокуВнутр если не знаю, что в структуре. Попробуйте сами. Объект - это основной реквизит управляемой формы.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Мне кажется бесполезно говорить про понятие указатель, если тот кому говорят о них знаком с программированием только на основе конструктора 1С. Этот как раз тот случай, когда 1С не учит, а разрушает мозг. Всё вроде как сделано для удобного программирования, но криво, косо и ужасно коряво задокументировано. За кажущейся простотой языка скрывается то, что в документации нет никаких внятных объяснений ни про работу виртуальной машины 1С, ни про то как отрабатывают директивы препроцессора, что происходит с исключениями, как отрабатывают транзакции, ну и в том числе где в памяти какие переменные хранятся, каков срок их жизни и кто имеет к ним доступ (это уже вообще такие мелочи). На сях например можно легко и непринужденно получить несколько разных указателей на одну и ту же строку или переменную и работать через разные указатели с одним и тем же экземпляром значения, но так простите там указатель это тип значения, может быть указатель на указатель или массив указателей (так все многоразмерные массивы по факту представлены). В 1С мало того что нет объектных типов, так даже для строк/чисел обязательного приведения типов нет, а ведь это основа статического анализа корректности кода. 1С как фирма ставила перед собой цель - сделать псевдоязык, на котором сможет кодить даже главбух. Они добились своего - язык простой и не требовательный к чистоте кода. А то что получающийся код может изобиловать ашипками и самыми тривиальными неоднозначностями, которые выплывут только в процессе выполнения (возможности проверить на соответствие типов до выполнения то нет).
И всё таки не понятно, почему уже фактически завоевав рынок, 1С продолжает это движение "язык для детского сада, штаны на лямках, пусть криво и косо, главное просто". Ведь с их размахом, с их желанием автоматизировать крупные организации, с озвученным "клиент-серверным" развитием, от этого псевдоязыка надо бежать как от чумы. Ну это моё мнение. Если оставлять псевдоязык, то приводить его к нормам таких языков как java, c++.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(60) Все-таки разница есть. Если по аналогии с БУ то есть трансляция учета, а есть трансформация. Так вот: Интерпретатор выполняет трансляцию, а компилятор трансформацию. Виртуальная машина - это интерпретатор байт кода . JIT - это компилятор. А интерпретатор языка - вообще никакой компиляции не выполняет. На интерпретируемых языках пишут сценарии , а на компилируемых - программы. Когда говорят, что: "1С-совцы не программисты" - я говорю: "Да, они сценаристы". Но 95% людей это все по барабану.
Глупость полная. Компиляция для Dalvik проходит дважды:
1. Исходники java -> байт код 2. Байт код -> DEX байт код
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(63) baton_pk, Это не байт-код,
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
То есть, оп.код обычно маленькое число, операций немного. У 1С меньше 255, что влезает в байт. А сама операция может быть и длиннее байта, там еще аргументы, а их длина может быть разной.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(67) печально-известный AlexO написал тоже об этом. В этом топике Я, как ни странно, на его стороне. Конечно он перегибает по поводу проблемности 1С.
Вот такие несогласованные вызовы:
В более сложный пример даже вникать не стал.
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Что только не продают; на чем только не пишут :) Я-же говорю о вечном. Паскаль я забросил, когда напоролся на проблемы в нем с виртуализацией методов (тогда еще он был TURBO). И понял, что надо двигаться дальше. Очень хороший язык для обучения, чтобы потом перейти к Си++.
- Скопировать ссылку
- Перейти
(76) ИНТЕГРА, не С++ - это лишь один из языков программирования. И если уж говорить о понимании того, как работает процессор, то можно заявить, что каждый программист должен знать ассемблер (я, например, для трех архитектур ассемблер знаю: Z80 (Спектрум), СМ (PDP-8, ДВК, . ), х86 (IBM-совместимые ПК). При том не просто знать команды, но и понимать архитектуру портов ввода-вывода (PC) / системных регистров (CM), знать вектора прерываний, . В итоге так мы дойдем до системного программиста, который решает совершенно иные задачи. Если верить книге "Совершенный код" (Макконнелл), то системный код куда сложнее прикладного и при ревизиях кода (методология уменьшения ошибок в программе примерно в 8 раз эффективнее тестирования) количество просматриваемых строк системного кода на порядок ниже, чем прикладного.
Да, знать какой-нибудь компилируемый язык программирования - это хорошо. Уметь написать на нем что-либо - еще лучше. Но эти знания сами по себе не дают никакого преимущества при разработке систем на базе 1С. Но если есть возможность применить подобные знания - это плюс. Например, у нас в конторе мы написали два приложения на Delphi. Первое - это стартер 1С, который получает информацию о списке баз из вебсервиса базы 1С, в которой содержится информация о пользователях и доступных им базах. Вторая - это принтер чеков для автоматической печати чеков из систем онлйан-бронирования. И все это из-за глючности самой 1С и невозможности доверить ей критические задачи, в которых время является одним из решающих факторов. Я не могу быть уверен, что клиент 1С. печатающий чеки по обработке ожидания, в один прекрасный момент не умрет. А вот постоянно рестартующий и самодиагностирующий комплекс на Delphi мало того, что запускается считанные микросекунды, так и анализ своей функциональности за доли секунды проверяет и при необходимости заменяет зависший процесс. В этом плюс такого подхода. Но если необходимо работать с сотней разных документов, сотней печатных форм, все это где-то хранить и не требовать немедленного доступа - 1С вполне подойдет. И в знаниях языков низкого и среднего уровня для доработки такой системы необходимости. ИМХО, нет.
- Скопировать ссылку
- Перейти
(78) starik-2005, Прочел твое сообщение только первый абзац. Молодец, что знаешь что-то еще помимо 1С. Это тебе дает преимущество при разработке перед чистым 1С-ником хотябы уже потому, что тебе не надо тратить время на понимание как работает передача параметров в функцию и делать детские ошибки, которые очень тяжело отловить.
Второй абзац прочел "по-диагонали", тк там лирика с которой я не согласен.
- Скопировать ссылку
- Перейти
Attention! Holy-war detected!
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(101) awk, ну как бы стандартом считают ANSI C (ISO C), написанная на котором программа будет компилироваться на любом компиляторе. В последствии стандарт был дополнен С99 и С11, которые, в общем и целом, вбирали в себя все отличия между С и С++, кроме указанного мной - объектной модели. В стандарт С11 даже была включена многопоточность, реализуемая соответствующими библиотеками.
Здесь, собственно, и говорится о том, что первоначально Бьерн занимался именно добавлением в С объектной модели. В остальном они в последней версии стандарта практически идентичны, если не считать накопленных за время совместного развития деталей, влияние которых на синтаксис весьма условно, а на функционал - менее, чем заметно.
- Скопировать ссылку
- Перейти
(102) starik-2005, Я не вижу смысла вам что-то расписывать, так как с то же страницы, откуда вы выдернули свою цитату есть:
Язык программирования C++ произошёл от Си. Однако в дальнейшем С и C++ развивались независимо, что привело к росту несовместимости между ними. Редакция C99 добавила в язык несколько конфликтующих с C++ особенностей. Эти различия затрудняют написание программ и библиотек, которые могли бы нормально компилироваться и работать одинаково и в С и в C++, что, конечно, запутывает тех, кто программирует на обоих языках.
Бьёрн Страуструп, придумавший C++, неоднократно выступал за максимальное сокращение различий между С и C++ для создания максимальной совместимости между этими языками. Противники же такой точки зрения считают, что так как С и C++ являются двумя различными языками, то и совместимость между ними не так важна, хоть и полезна. Согласно этому лагерю, усилия по уменьшению несовместимости между ними не должны препятствовать попыткам улучшения каждого языка в отдельности.
Различия между этими языками, существующие на сегодня[когда?]:
inline — подставляемые функции существуют в глобальном пространстве C++, а в Си — в пространстве файла (статическом пространстве). Другими словами, это значит, что в C++ любое определение подставляемой функции (независимо от переопределения функций) должно соответствовать правилу одного определения, требующего того, чтобы любая подставляемая функция была определена только один раз. В С же одна и та же подставляемая функция может быть определена по-разному в разных компилируемых файлах одной программы. В отличие от C++, макрос bool в C99 требует включения соответствующего заголовочного файла stdbool.h. В стандарте C99 определён собственный тип логических данных _Bool. Предыдущий стандарт С (C89) не определял булевый тип вообще, поэтому для этого часто использовались различные (а значит, несовместимые) методы. Символьные константы (заключённые в одинарные кавычки) по умолчанию имеют: тип int в С и тип char в C++. Поэтому в С справедливо равенство sizeof('a') == sizeof(int), а в C++ — равенство sizeof('a') == sizeof(char).[11] Некоторые новые возможности C99, в первую очередь, restrict, не включены в C++.
Что наводит меня на мысль о бессмысленности больших постов для вас. Вы их не прочтете.