Вконтакте Facebook Twitter Лента RSS

Не отличается от какого либо. Дефис или тире: разница между этими знаками. Упражнение на закрепление

Когда параметр передается по значению , вызывающий и вызываемый имеют две независимые переменные с одинаковым значением. Если вызываемый изменяет переменную параметра, эффект не отображается вызывающему.

Однако , если рассматриваемое значение является изменчивым объектом ссылочного типа или иным образом косвенно ссылается на другие значения, то вы можете эмулировать call-by-reference в среде с обратным значением: если вызываемый изменяет объект (или другие значения указывают к объекту), эти изменения видны вызывающему. Но эмуляция не совсем то же самое, поскольку видны только изменения объекта , а не переменной . Это приводит к искаженным объяснениям, таким как «вызов по значению, где значение является ссылкой». Это несколько запутанное положение дел состоит в том, как многие популярные языки программирования работают сегодня, и поэтому люди часто путают передачу изменяемых объектов по значению с помощью вызова по ссылке.

Подробнее см. В других ответах ниже.

ПРИМЕЧАНИЕ . В течение долгого времени этот ответ говорил:

Если я распечатаю страницу и даю вам распечатку, я передаю ее значение. Ваша страница является отключенной копией оригинала. Вы не увидите никаких последующих изменений, и любые изменения, которые вы делаете (например, наброски на распечатку), не будут отображаться на исходной странице. Если вы уничтожите распечатку, вы фактически уничтожили свою копию объекта, но исходная веб-страница остается нетронутой.

Это простая аналогия, которую легко понять, которая получила этот пост сотнями голосов. Однако аналогия ошибочна: call-by-reference и call-by-value не похожи на URL-адреса. (Тип ссылки на языке, подобном C #, похож на URL-адрес, см. Замечательную статью Джона Скита о ссылочных типах в.NET для подробностей. Но ссылочные типы – это не то же самое, что передавать по ссылке .)

Поскольку эта аналогия на самом деле не правильная, она удалена из этого ответа. См. Также комментарии ниже, где это обсуждалось.

Это способ передачи аргументов в функции. Передача по ссылке означает, что параметр вызываемых функций будет таким же, как переданный аргумент вызывающих (а не значение, а идентификатор – сама переменная). Передача по значению означает, что параметр вызываемых функций будет копией переданного аргумента вызывающих. Значение будет одинаковым, но идентификатор – переменная – отличается. Таким образом, изменение параметра, выполняемого вызываемой функцией в одном случае, изменяет переданный аргумент, а в другом случае просто изменяет значение параметра в вызываемой функции (которая является только копией). Быстро спешите:

  • Java поддерживает только передачу по значению. Всегда копирует аргументы, даже если при копировании ссылки на объект параметр вызываемой функции указывает на тот же объект, и изменения в этом объекте будут отображаться в вызывающем. Поскольку это может сбивать с толку, вот что говорит Джон Скит об этом.
  • C # поддерживает передачу по значению и передает по ссылке (ключевое слово ref используемое при вызове и вызываемой функции). У Джона Скита также есть хорошее объяснение этого здесь.
  • C ++ поддерживает передачу по значению и передает по ссылке (тип ссылочного параметра, используемый в вызываемой функции). Ниже вы найдете объяснение этого.

Поскольку мой язык – C ++, я буду использовать это здесь

// passes a pointer (called reference in java) to an integer void call_by_value(int *p) { // :1 p = NULL; } // passes an integer void call_by_value(int p) { // :2 p = 42; } // passes an integer by reference void call_by_reference(int & p) { // :3 p = 42; } // this is the java style of passing references. NULL is called "null" there. void call_by_value_special(int *p) { // :4 *p = 10; // changes what p points to ("what p references" in java) // only changes the value of the parameter, but *not* of // the argument passed by the caller. thus it"s pass-by-value: p = NULL; } int main() { int value = 10; int * pointer = &value; call_by_value(pointer); // :1 assert(pointer == &value); // pointer was copied call_by_value(value); // :2 assert(value == 10); // value was copied call_by_reference(value); // :3 assert(value == 42); // value was passed by reference call_by_value_special(pointer); // :4 // pointer was copied but what pointer references was changed. assert(value == 10 && pointer == &value); }

И пример в Java не повредит:

Class Example { int value = 0; // similar to:4 case in the c++ example static void accept_reference(Example e) { // :1 e.value++; // will change the referenced object e = null; // will only change the parameter } // similar to the:2 case in the c++ example static void accept_primitive(int v) { // :2 v++; // will only change the parameter } public static void main(String... args) { int value = 0; Example ref = new Example(); // reference // note what we pass is the reference, not the object. we can"t // pass objects. The reference is copied (pass-by-value). accept_reference(ref); // :1 assert ref != null && ref.value == 1; // the primitive int variable is copied accept_primitive(value); // :2 assert value == 0; } }

Википедия

http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_value

http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference

Этот парень довольно много гвоздями:

Вот пример:

#include void by_val(int arg) { arg += 2; } void by_ref(int&arg) { arg += 2; } int main() { int x = 0; by_val(x); std::cout

Многие ответы здесь (и, в частности, самый высокий ответ) фактически неверны, поскольку они неправильно понимают, что означает «вызов по ссылке». Вот моя попытка разобраться.

TL; DR

Проще говоря:

  • вызов по значению означает, что вы передаете значения в качестве аргументов функции
  • вызов по ссылке означает, что вы передаете переменные как аргументы функции

В метафорических выражениях:

  • Вызов по значению – это то, где я записываю что-то на листе бумаги и передаю его вам . Возможно, это URL, может быть, это полная копия «Войны и мира». Независимо от того, что это, это на листе бумаги, который я вам дал, и теперь это фактически ваш лист бумаги . Теперь вы можете писать на этом листе бумаги или использовать этот лист бумаги, чтобы найти что-то в другом месте и поиграть с ним.
  • Звоните по ссылке , когда я даю вам свою записную книжку, в которой записано что-то . Вы можете писать в моей записной книжке (может быть, я хочу, чтобы вы это сделали, может быть, я этого не сделаю), а потом я держу свою тетрадь с любыми каракулями, которые вы там положили. Кроме того, если то, что либо вы, либо я написал там, есть информация о том, как найти что-то в другом месте, либо вы, либо я можем пойти туда и поиграть с этой информацией.

Что «вызов по значению» и «вызов по ссылке» не означает

Обратите внимание, что обе эти концепции полностью независимы и ортогональны из концепции ссылочных типов (которые в Java – это все типы, которые являются подтипами Object , а в C # – все типы class) или понятие типов указателей, подобных C (которые семантически эквивалентно «ссылочным типам» Java, просто с различным синтаксисом).

Понятие ссылочного типа соответствует URL-адресу: он сам является частью информации, и это ссылка (указатель , если хотите) на другую информацию. Вы можете иметь много копий URL-адреса в разных местах, и они не изменяют, на каком веб-сайте они все ссылаются; если веб-сайт обновляется, то каждая копия URL-адреса все равно приведет к обновленной информации. И наоборот, изменение URL-адреса в любом месте не повлияет на любую другую письменную копию URL-адреса.

Обратите внимание, что C ++ имеет понятие «ссылки» (например, int&), которое не похоже на «ссылочные типы» Java и C #, но похоже на «вызов по ссылке». «Ссылочные типы» Java и C # и все типы в Python похожи на то, что C и C ++ вызывают «типы указателей» (например, int*).

Хорошо, вот длиннее и более формальное объяснение.

терминология

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

Для начала, вот пример на каком-нибудь C-подобном языке объявления функции:

Void foo(int param) { // line 1 param += 1; }

И вот пример вызова этой функции:

Void bar() { int arg = 1; // line 2 foo(arg); // line 3 }

Используя этот пример, я хочу определить некоторые важные биты терминологии:

  • foo – это функция, объявленная в строке 1 (Java настаивает на том, чтобы делать все функции, но концепция без потери общности, C и C ++ делают различие между декларацией и определением, в которые я не буду входить)
  • param является формальным параметром foo , также объявленным в строке 1
  • arg – это переменная , в частности локальная переменная функциональной bar , объявленная и инициализируемая в строке 2
  • arg также является аргументом для конкретного вызова foo на строку 3

Здесь есть два очень важных набора понятий. Первый – это значение по сравнению с переменной :

  • Значение является результатом оценки выражения на языке. Например, в функции bar выше, после строки int arg = 1; , выражение arg имеет значение 1 .
  • Переменная – это контейнер для значений . Переменная может быть изменчивой (это по умолчанию используется на большинстве C-подобных языков), только для чтения (например, объявлено с использованием final версии Java или C # только для readonly) или глубоко непреложным (например, с использованием константы C ++).

Другая важная пара понятий для различения – параметр против аргумента :

  • Параметр (также называемый формальным параметром ) – это переменная, которая должна быть вызвана вызывающим при вызове функции.
  • Аргумент – это значение , которое предоставляется вызывающей функцией для выполнения определенного формального параметра этой функции

Вызов по значению

В вызове по значению формальные параметры функции являются переменными, которые были созданы для вызова функции, и которые инициализируются значениями их аргументов.

Это работает точно так же, как любые другие типы переменных инициализируются значениями. Например:

Int arg = 1; int another_variable = arg;

Здесь arg и another_variable являются полностью независимыми переменными – их значения могут меняться независимо друг от друга. Однако в точке, где объявляется another_variable , она инициализируется для хранения того же значения, которое имеет значение arg которое равно 1 .

Поскольку они являются независимыми переменными, изменения в another_variable не влияют на arg:

Int arg = 1; int another_variable = arg; another_variable = 2; assert arg == 1; // true assert another_variable == 2; // true

Это в точности то же самое, что и отношение между arg и param в нашем примере выше, которое я повторю здесь для симметрии:

Void foo(int param) { param += 1; } void bar() { int arg = 1; foo(arg); }

Это точно так, как если бы мы написали код таким образом:

// entering function "bar" here int arg = 1; // entering function "foo" here int param = arg; param += 1; // exiting function "foo" here // exiting function "bar" here

То есть определяющей характеристикой того, что вызов по значению означает, является то, что вызываемый (foo в этом случае) получает значения в качестве аргументов, но имеет свои собственные переменные для этих значений из переменных вызывающего (в этом случае bar).

Возвращаясь к моей метафоре выше, если я нахожусь в bar а ты – foo , когда я тебя зову, я вручу тебе лист бумаги со значением, написанным на нем. Вы называете этот лист бумаги param . Это значение является копией значения, которое я написал в моей записной книжке (мои локальные переменные), в переменной, которую я вызываю arg .

(В стороне: в зависимости от аппаратного обеспечения и операционной системы существуют различные соглашения о том, как вы вызываете одну функцию из другой. Вызывающее соглашение похоже на то, как мы решаем, записываю ли значение на куске своей бумаги, а затем передаю ее вам, или если у вас есть листок бумаги, на который я его напишу, или если я напишу его на стене перед нами обоими. Это интересная тема, но далеко за frameworks этого уже долгого ответа.)

Вызов по ссылке

Возвращаясь к нашему примеру выше, это эквивалентно:

// entering function "bar" here int arg = 1; // entering function "foo" here // aha! I note that "param" is just another name for "arg" arg /* param */ += 1; // exiting function "foo" here // exiting function "bar" here

Поскольку param является просто другим именем для arg то есть они являются одной и той же переменной , изменения в param отражены в arg . Это основной способ, которым вызов по ссылке отличается от вызова по значению.

Очень немногие языки поддерживают вызов по ссылке, но C ++ может сделать это следующим образом:

Void foo(int& param) { param += 1; } void bar() { int arg = 1; foo(arg); }

В этом случае param имеет не только то же значение, что и arg , но на самом деле это arg (просто другое имя), и поэтому bar может заметить, что arg был увеличен.

Обратите внимание: это не так, как работает любой Java, JavaScript, C, Objective-C, Python или почти любой другой популярный язык. Это означает, что эти языки не звонят по ссылке, они вызывают по значению.

Добавление: вызов по обмену объектами

Если то, что у вас есть, является вызовом по значению , но фактическое значение является ссылочным типом или типом указателя , тогда само значение «значение» не очень интересно (например, в C это всего лишь целое число определенного для платформы размера) – что Интересно то, на что указывает это значение.

Если то, что указывает этот ссылочный тип (то есть указатель), является изменчивым, тогда возможен интересный эффект: вы можете изменить указанное значение, и вызывающий может наблюдать изменения указательного значения, даже если вызывающий не может наблюдать изменения самого указателя.

Чтобы заимствовать аналогию с URL-адресом еще раз, тот факт, что я дал вам копию URL-адреса на веб-сайт, не особенно интересен, если мы обоим заботимся о веб-сайте, а не о URL-адресе. Тот факт, что вы нацарапаете свою копию URL-адреса, не влияет на мою копию URL-адреса, это не то, о чем мы заботимся (и на самом деле, на таких языках, как Java и Python, «URL» или ссылочное значение типа, вообще не изменяйтесь, только то, на что указывает, может).

Барбара Лисков, когда она придумала язык программирования CLU (который имел эти семантики), понял, что существующие термины «вызов по значению» и «вызов по ссылке» не были особенно полезны для описания семантики этого нового языка. Поэтому она придумала новый термин: вызов путем совместного использования объектов .

При обсуждении языков, которые технически вызывают по значению, но где обычные типы используются, являются ссылочными или указательными типами (то есть: почти каждый современный императивный, объектно-ориентированный или многопарадигменный язык программирования), я считаю, что это намного менее запутанно просто не говорите о вызове по значению или вызовите по ссылке . Придерживайтесь вызова путем совместного использования объектов (или просто вызывайте объект ), и никто не будет путать. 🙂

Прежде чем понимать 2 условия, вы ДОЛЖНЫ понимать следующее. Каждый объект имеет две вещи, которые могут отличить его.

  • Его ценность.
  • Его адрес.

Так что если вы скажете employee.name = "John"

знайте, что есть 2 вещи о name . Его значение, которое есть "John" а также его расположение в памяти, которое является шестнадцатеричным числом, может быть примерно таким: 0x7fd5d258dd00 .

В зависимости от архитектуры языка или типа (classа, структуры и т. Д.) Вашего объекта вы будете либо передавать "John" либо 0x7fd5d258dd00

Передача "John" считается передачей по значению. Передача 0x7fd5d258dd00 считается передачей по ссылке. Любой, кто указывает на это место памяти, будет иметь доступ к значению "John" .

Самый простой способ получить это – в файле Excel. Скажем, например, что у вас есть два числа, 5 и 2 в ячейках A1 и B1 соответственно, и вы хотите найти их сумму в третьей ячейке, скажем, A2. Вы можете сделать это двумя способами.

    Либо передавая их значения ячейке A2 , введя в эту ячейку = 5 + 2 . В этом случае, если значения ячеек A1 или B1 меняются, сумма в A2 остается неизменной.

    Или путем передачи «ссылок» на ячейки A1 и B1 на ячейку A2 , набрав = A1 + B1 . В этом случае, если значения ячеек A1 или B1 меняются, сумма в A2 также изменяется.

Pass By Value Локальные параметры – это копии исходных аргументов, переданных в Изменения, внесенные в функцию, к этим переменным , не влияют на оригиналы

Передача по ссылке Локальные параметры – это ссылки на места хранения исходных аргументов. Изменения этих переменных в функции влияют на оригиналы. Копирование не производится, поэтому сохраняются накладные расходы на копирование (время, память)

При передаче по ref вы в основном передаете указатель на переменную. Переходите по значению, вы передаете копию переменной. При базовом использовании это обычно означает, что с помощью ref изменения переменной будут рассматриваться как вызывающий метод и передаются по их значению.

Передача по значению отправляет КОПИЮ данных, хранящихся в указанной вами переменной, передает по ссылке отправляет прямую ссылку на эту переменную. Поэтому, если вы передаете переменную по ссылке и затем измените переменную внутри блока, в который вы ее передали, исходная переменная будет изменена. Если вы просто переходите по значению, исходная переменная не сможет быть изменена блоком, в который вы его передали, но вы получите копию того, что она содержала во время разговора.

Основное различие между ними заключается в том, что значения переменных типа хранят значения, поэтому указание переменной типа значения в вызове метода передает копию значения этой переменной методу. Переменные ссылочного типа хранят ссылки на объекты, поэтому указание переменной ссылочного типа в качестве аргумента передает методу копию фактической ссылки, относящейся к объекту. Несмотря на то, что сама ссылка передается по значению, метод все равно может использовать ссылку, которую он получает, для взаимодействия с возможным и, возможно, модификацией исходного объекта. Аналогично, при возврате информации из метода с помощью оператора return метод возвращает копию значения, хранящегося в переменной типа значения, или копию ссылки, хранящейся в переменной ссылочного типа. Когда ссылка возвращается, вызывающий метод может использовать эту ссылку для взаимодействия с указанным объектом. Таким образом, объекты фактически передаются по ссылке.

В c #, чтобы передать переменную по ссылке, чтобы вызываемый метод мог изменять переменную, C # предоставляет ключевые слова ref и out. Применение ключевого слова ref к объявлению параметра позволяет передать переменную методу по ссылке – вызываемый метод сможет изменить исходную переменную в вызывающем. Ключевое слово ref используется для переменных, которые уже были инициализированы в вызывающем методе. Обычно, когда вызов метода содержит неинициализированную переменную в качестве аргумента, компилятор генерирует ошибку. Предшествующий параметр с выделением ключевого слова создает выходной параметр. Это указывает компилятору, что аргумент будет передан вызываемому методу по ссылке и что вызываемый метод назначит значение исходной переменной в вызывающем. Если метод не присваивает значение выходному параметру во всех возможных путях выполнения, компилятор генерирует ошибку. Это также мешает компилятору генерировать сообщение об ошибке для неинициализированной переменной, которая передается в качестве аргумента методу. Метод может возвращать только одно значение своему вызывающему абоненту через оператор return, но может возвращать многие значения, задавая несколько параметров вывода (ref и / или out).

см. обсуждение c # и примеры здесь текст ссылки

Pass by value – функция копирует переменную и работает с копией (поэтому она не меняет ничего в исходной переменной)

Пример (скопируйте и используйте / попробуйте сами и посмотрите):

#include using namespace std; void funct1(int a){ //pass-by-value a = 6; //now "a" is 6 only in funct1, but not in main or anywhere else } void funct2(int &a){ //pass-by-reference a = 7; //now "a" is 7 both in funct2, main and everywhere else it"ll be used } int main() { int a = 5; funct1(a); cout

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

Class Dog { public: barkAt(const std::string& pOtherDog); // const reference barkAt(std::string pOtherDog); // value };

const & обычно лучше. Вы не берете на себя штраф за строительство и уничтожение. Если ссылка не const, ваш интерфейс предполагает, что он изменит переданные данные.

Короче говоря, Passed by value WHAT это и передается по ссылке WHERE.

Если ваше значение VAR1 = «Счастливый парень!», Вы увидите только «Счастливый парень!». Если VAR1 изменится на «Happy Gal!», Вы этого не узнаете. Если он передан по ссылке, а VAR1 изменится, вы это сделаете.

По определению pass by value означает, что вы делаете копию в памяти фактического значения параметра, которое передается, копия содержимого фактического параметра. Используйте pass by value, когда вы только «используете» параметр для некоторых вычислений, не изменяя его для клиентской программы.

pass by value означает, как передать значение функции, используя аргументы. в проходе по значению мы копируем данные, хранящиеся в указанной нами переменной, и она медленнее, чем передача по ссылке bcse. Данные копируются. мы вносим изменения в скопированные данные, исходные данные не затрагиваются. nd в pass by refernce или передать по адресу, мы отправляем прямую ссылку на самую переменную. или передавая указатель на переменную. это быстрее bcse меньше времени потребляется

Если вы не хотите изменять значение исходной переменной после передачи ее в функцию, функция должна быть построена с параметром « pass by value ».

Тогда функция будет иметь ТОЛЬКО значение, но не адрес переданной переменной. Без адреса переменной код внутри функции не может изменить значение переменной, как видно из внешней функции.

Но если вы хотите, чтобы функция * изменяла значение variabl * e, как видно извне, вам нужно использовать pass by reference . Поскольку и значение, и адрес (ссылка) передаются и доступны внутри функции.

Вот пример, демонстрирующий различия между pass by value – значением указателя – reference :

Void swap_by_value(int a, int b){ int temp; temp = a; a = b; b = temp; } void swap_by_pointer(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp; } void swap_by_reference(int &a, int &b){ int temp; temp = a; a = b; b = temp; } int main(void){ int arg1 = 1, arg2 = 2; swap_by_value(arg1, arg2); cout

Метод «передача по ссылке» имеет важное ограничение . Если параметр объявлен как переданный по ссылке (поэтому ему предшествует знак &), его соответствующий фактический параметр должен быть переменной .

Фактический параметр, относящийся к формальному параметру «переданный по значению», может быть выражением в целом, поэтому ему разрешено использовать не только переменную, но и литерал или даже результат вызова функции.

Функция не может поместить значение в нечто иное, кроме переменной. Он не может назначить новое значение литералу или заставить выражение изменить его результат.

PS: Вы также можете проверить ответ Дилана Битти в текущем streamе, который объясняет это простыми словами.

По значению: когда аргументы передаются по значению методу, это означает, что копия фактической переменной отправляется методу, а не фактическая, поэтому любые изменения, применяемые внутри метода, фактически влияют на версию копирования.

Проверьте эту статью для получения дополнительных примеров.

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

Difference

Произношение и перевод:

Difference [’dɪfərəns] / [ди"фрэнс] - различие

Значение слова:
Ситуация, когда две или более вещи не похожи друг на друга.

Употребление:
Мы используем это слово, когда говорим о том, что что-то или кто-то отличается друг от друга. То есть указываем на факт того, что кто-либо или что-либо имеет различный набор качеств или черт.

Пример:

I didn"t realize the difference between them.
Я не понимаю разницу между ними.

We had a slight difference of opinion.
У нас было небольшое различие мнений.

Distinction

Произношение и перевод:

Distinction / [дисти"нкшен] - различие

Значение слова:
Очевидное различие или разделение между двумя похожими вещами.

Употребление:
Мы используем это слово, когда что-либо или кто-либо имеет какие-то специфические качества . И именно эти качества помогают нам легко отличить это от других вещей/людей такого же типа.

Пример:

В чем разница?

Мы используем distinction , когда сравниваем что-либо одного типа или вида. И говорим что у чего-то/кого-то, есть специфическое качество, которое явно отличает это от остальных. Например, у одной собаки в стае на боку есть большое черное пятно, это и есть ее distinction от остальных.

Мы используем difference , когда просто отмечаем сам факт "непохожести". Причем сравнивать мы можем вещи как и одного типа, так и совершенно разные. Например, собаки имеют difference от кошек.

Упражнение на закрепление

Вставьте правильное слово в следующие предложения:

1. Она никогда не заметит ___.
2. ___ в возрасте не имеет значения.
3. Даже ребенок заметит ___ между ними.
4. ___ между двумя машинами очевидна.
5. Часто людям трудно заметить ___ между близнецами.
6. Эту ___ вы сразу заметите.
7. Между этими двумя предложениями она видела огромную ___.
8. Два этих галстука имеют ___.

Свои ответы пишите в комментариях под статьей, а я их проверю.

Одной из самых распространенных ошибок русского языка на письме - это неправильная расстановка неалфавитных знаков. К сожалению, это явление не обходит стороной и печатные издания. И хотя каждый знак регулируется собственными правилами написания, тем не менее 70 % ошибок в тексте приходится именно на них. В рамках этой статьи будет рассмотрено, в чем состоит разница между дефисом и тире, история их появления в русской грамматике и сегодняшние нормы употребления на письме.

Два разных понятия

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

Употребление дефиса (-) или тире (—) на письме будет напрямую зависеть от поставленной задачи в тексте: соединить части сложного слова или разделить части предложения. Написание тире внутри слова, как и дефиса между самостоятельными словами, будет являться грубейшей ошибкой. Кроме того, в отличие от тире дефис является небуквенным орфографическим знаком. Другими словами, дефис должен использоваться только согласно правилам орфографии, в то время как тире — установленным пунктуационным нормам русского языка.

История дефиса

Говоря о разнице тире и дефиса, невозможно не затронуть историю появления этих символов в русском письме.

Возникновение орфографического знака «дефис» относят к периоду, когда написание слов стали разделять пробелом. В букварях и различных учебных пособиях XVIII века его именовали «знаком единительства». А столетие спустя появились первые уточнения и регулировки по употреблению знака в тексте, предложенные академиком Я. Гротом. Некоторые его рекомендации (правила) используются и по сей день.

В русском языке термин «дефис» возник к середине XIX века, когда шло активное заимствование немецкой типографской терминологии. Немецкое слово divis произошло от латинского divisio и означало расчленение, разделение. Интересно, что длительное время слово дефис применялось лишь в специфической литературе. И только в 1930-е годы он становится синонимом соединительной черточки.

Когда ставится дефис

Согласно установленным правилам русского языка, дефис употребляется без пробелов в следующих случаях:

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

Всякий раз, когда встает вопрос о постановке дефиса или тире, в первую очередь следует обратить внимание, где непосредственно происходит загвоздка: в пределах слова или в пределах предложения.

Как появилось тире

Тире (от фр. слова tirer — растягивать) является достаточно распространенным знаком препинания, употребляемым во многих языках. Первые упоминания о тире датируются XII веком, когда Бонкомпаньо да Синья, итальянский писатель, выступил с новым предложением о пунктуации. В новой системе предлагалось всего два элемента, одним из которых было тире. Автор определил его функцию лишь как знака завершения предложения. Хотя по тем временам и это являлось немалым достижением. Некоторые исследователи склоны считать, что именно этот знак является родоначальником современного тире.

В XVIII веке Г. Р. Державин и Н. М. Карамзин стали настоятельно вводить в России употребление нового знака — тире. Некоторым это новшество не понравилось, его принимали с враждебностью, так как не видели в нем большой необходимости. И первое время едва ли чем тире отличали от дефиса. Его называли по-разному: черная полоса, знак пересечения, линейка, черта. Шаг за шагом, отвоевывая свои позиции, знак уверенно внедрялся в русскую письменную речь.

Когда ставится тире

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

Итак, тире ставится:

  • перед репликой в диалоге;
  • между прямой речью и словами автора;
  • между частями бессоюзного сложного предложения: если во второй части предложения заключается результат или вывод, если во второй части имеет место противопоставление или присоединение, если первая часть предложения содержит значение условия (или времени);
  • перед обобщающим словом после однородных членов предложения;
  • перед приложением, стоящим в конце предложения, если можно вставить конструкцию «а именно» без искажения смысла, например: в разговоре от меня ожидали только одного — честности;
  • перед словами «вот», «это», «это значит» в предложениях, где сказуемое — существительное в именительном падеже (или инфинитив);
  • при пропуске члена предложения (часто сказуемого) в неполных предложениях в составе сложного;
  • при отсутствии глагола-связки, например: искусство — отражение жизни.

И еще одна важная деталь: в отличие от дефиса тире всегда отделяется пробелами с обеих сторон.

Сложные случаи

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

Вот несколько моментов, которые могут доставить затруднения:

  • Цифры в словесной форме с разницей в одну единицу будут писаться через дефис: один-два или пять-шесть. Но в остальных случаях ставится тире с пробелами: пять — семь, один — три.
  • Между цифрой и словом всегда указывается дефис без пробелов. К примеру, 15-килограммовый арбуз.
  • Когда в тексте есть значение «от и до» правильным написанием будет тире. Например, самолет Москва — Ташкент или газопровод Сахалин — Хабаровск — Владивосток.
  • Тире ставится также в случаях, когда указываются имена собственные в совокупности дающие названия каким-либо учреждениям, законам, документам. Например, пакт Молотова — Риббентропа или закон Джоуля — Ленца.
  • При написании двойных фамилий ставится дефис: Д. Н. Мамин-Сибиряк или А. С. Михалков-Кончаловский.
  • Дефис не ставится, если в соединении участвует компонент имеющий пробел. Например, фирма — учредитель проекта или дом — памятник архитектуры.

Дефис и тире в Ворде (Word)

Не всегда пренебрежение или неправильная расстановка небуквенных элементов в печатных текстах происходит от безграмотности в этом вопросе. Зачастую рядовые пользователи просто не знают куда «жать». Работая в Word или еще в каких-либо программах, с постановкой дефиса обычно проблем не возникает. С его ролью успешно справляется дефисоминус (-), чье расположение определяется в верхнем числовом ряду. Интересно, что сам символ уступает в размерах и дефису и минусу, но это нисколько не мешает исполнять возложенные на него функции.

Затруднения начинаются, когда в тексте нужно поставить тире, а не дефис. Как быть в таком случае? Один из самых простых способов, это воспользоваться в программе Word вкладкой «Вставка», а затем «Символы». И большинству пользователей этого вполне достаточно. Но есть еще один несложный способ получить тире: набрать цифру 2014, а затем нажать комбинацию клавиш Alt + X. А цифра 2013 с тем же сочетанием даст тире чуть меньшей длины.

Длина тире

Следует отметить, что в русском языке длина тире никакими правилами пунктуации (или типографики) не оговаривается. Но сегодня в связи с развитием и распространением компьютерных систем, по примеру англоязычных государств, стали использовать длинное и среднее тире. Они существенно отличаются по своим функциям: среднее тире соединяет сложные слова, используется между словами и цифрами, обозначающими диапазон (интервал), длинное тире помогает выделить вводное предложение, указывает остановку повествования и другое. Обычно длинное и среднее тире изготавливаются шрифтовиками шириной букв M и N соответственно, отсюда и английские названия em-dash и en-dash.

Русская типографская традиция имеет только три типа горизонтальных линий: тире, знак минуса и дефис.

  • Первые написания дефисных слов в России были зафиксированы в 1703 году в газете «Ведомости».
  • В XVIII веке нередко допускалось, что дефис выполнял функцию тире и многоточия. Стоит заметить, что в текстах того времени постановка знаков тире или дефиса была не столь принципиальным делом.
  • В конце XVIII века знак тире именовался термином «молчанка», за его функцию прерывать начатую речь.
  • Популярность тире в России пришла через Н. М. Карамзина, но истинным любителем этого знака считается Марина Цветаева.
  • В русском языке тире появилось позже всех остальных знаков препинания.
  • Авторские знаки препинания зачастую выходят за границы общих правил и всецело зависят от пишущего, помогая ему передать нужный смысл. Таким образом авторы, когда используют уплотненную речь в тексте или когда хотят усилить расчленение сложноподчиненных предложений, прибегают к тире.

Как и оператор & и && , двойной оператор является оператором «короткого замыкания».

Например:

If(condition1 || condition2 || condition3)

Если условие 1 истинно, условия 2 и 3 НЕ будут проверяться.

If(condition1 | condition2 | condition3)

Это проверит условия 2 и 3, даже если 1 уже верно. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хороший прирост производительности, используя их.

Существует одно большое оговорка, NullReferences или аналогичные проблемы. Например:

If(class != null && class.someVar < 20)

Если класс равен null, if-statement остановится после class != null – false. Если вы используете только &, он попытается проверить class.someVar, и вы получите красивое NullReferenceException . С Or-Operator, который может быть не такой ловушкой, как маловероятно, что вы запускаете что-то плохое, но это то, что нужно иметь в виду.

Никто никогда не использует сингл & or | однако, если у вас нет дизайна, где каждое условие является функцией, которая должна выполняться. Звучит как дизайнерский запах, но иногда (редко) это чистый способ делать вещи. Оператор & выполняет «эти 3 функции, и если один из них возвращает false, выполните блок else», а | «запускает только блок else, если не возвращает false» – может быть полезным, но, как сказано, часто это запах дизайна.

Существует второе использование | и & оператор: Побитовые операции.

|| является логическим оператором OR. Похоже, вы в основном знаете, что это такое. Он используется в условных операторах, таких как if, while и т. Д.

Condition1 || condition2

Вычисляет значение true, если условие condition1 ИЛИ condition2 истинно.

| является побитовым оператором ИЛИ. Он используется для работы с двумя номерами. Вы смотрите каждый бит каждого номера отдельно и, если один из битов равен 1, по крайней мере, одному из чисел, тогда результирующий бит будет равен 1. Вот несколько примеров:

A = 01010101 B = 10101010 A | B = 11111111 A = 00000001 B = 00010000 A | B = 00010001 A = 10001011 B = 00101100 A | B = 10101111

Надеюсь, это имеет смысл.

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

Один из них «побитовое».

10011b | 01000b => 11011b

Другая логика или.

true или false => true

Хороший вопрос. Эти два оператора работают одинаково в PHP и C #.

| является побитовым ИЛИ. Он будет сравнивать два значения по их битам. Например 1101 | 0010 = 1111. Это очень полезно при использовании опций бит. Например, Read = 01 (0X01) Запись = 10 (0X02) Чтение-запись = 11 (0X03). Один из полезных примеров – открытие файлов. Простой пример:

File.Open(FileAccess.Read | FileAccess.Write); //Gives read/write access to the file

|| является логическим ИЛИ. Так обстоит дело с большинством людей и сравнивает два значения, основанные на их истине. Например, я еду в магазин, или я пойду в торговый центр. Это чаще всего используется в коде. Например

If(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer

Простой пример в java

Public class Driver { static int x; static int y; public static void main(String args) throws Exception { System.out.println("using double pipe"); if(setX() || setY()) {System.out.println("x = "+x); System.out.println("y = "+y); } System.out.println("using single pipe"); if(setX() | setY()) {System.out.println("x = "+x); System.out.println("y = "+y); } } static boolean setX(){ x=5; return true; } static boolean setY(){ y=5; return true; } }

Using double pipe x = 5 y = 0 using single pipe x = 5 y = 5

Один канал, |, является одним из побитовых операторов.

Из Википедии:

В семействе языков программирования C побитовый оператор OR является «|» (Труба). Опять же, этот оператор не следует путать с его логическим «логическим» или «параллельным», который обрабатывает его операнды как булевы значения и записывается «||», (две трубы).

& – (Условие 1 и Условие 2): проверяет оба случая, даже если первый – false

&& – (Условие 1 && Условие 2): не надо проверять второй случай, если случай один неверен

&& – оператор сделает ваш код быстрее, профессионально и редко используется

| – (Условие 1 | Условие 2): проверяет оба случая, даже если случай 1 истинен

|| – (Условие 1 || Условие 2): не надо проверять второй случай, если первое верно

|| – оператор сделает ваш код быстрее, профессионально | редко используется

По их математическому определению OR и AND являются бинарными операторами; они проверяют условия LHS и RHS независимо от того, как | а также &.

|| и && изменяют свойства операторов OR и AND, останавливая их, когда условие LHS не выполняется.

| оператор выполняет побитовое ИЛИ своих двух операндов (что означает, что обе стороны должны оценивать значение false, чтобы оно возвращало false), в то время как || оператор будет оценивать только второй оператор, если это необходимо.

Синяя труба "|" является «поразрядным» или его следует использовать только тогда, когда вы знаете, что делаете. Двойная труба "||" является логическим или может использоваться в логических операторах, таких как «x == 0 || x == 1».

Вот пример того, что поразрядно или делает: если a = 0101 и b = 0011, тогда a | b = 0111. Если вы имеете дело с логической системой, которая обрабатывает любые ненулевые значения как истинные, то побитовое или будет действовать так же, как логическое или, но это аналог (побитовое и, «&») будет NOT. Также побитовое или не выполняет оценку короткого замыкания.

Один канал (|) является побитовым оператором OR .

Две трубы (||) являются логическим оператором ИЛИ.

Они не взаимозаменяемы.

|| (две трубы), как правило, логично или пока | (одна труба) является двоичной или. В верхней части моей головы я не могу думать, что разница была бы большой, если бы вы назначили результат чему-то еще. Однако я уверен, что у кого-то еще будет ситуация, когда это имеет значение.

Редактировать: Вау, шесть других ответов за то время, когда мне потребовалось написать это.

Побитовое (|) против логического (||)! Подумайте логично, как объекты Comparable в Java, сравнивая некоторые отличимые «части», в то время как побитовый оператор смотрит на эти объекты и вместо того, чтобы видеть, являются ли они визуально близнецами (как и логические), делает ли образец ДНК и смотрит на 0 и 1 вместо.

    Толковый словарь Ушакова

    ЛИБО, разделительный союз. Или. Поеду на Кавказ либо в Крым. || то же с повторением: либо либо. Или или. «Либо пан, либо пропал.» погов. «Старое общество было основано на таком принципе, что либо ты грабишь другого, либо другой грабит тебя, либо… … Толковый словарь Ушакова

    ЛИБО, разделительный союз. Или. Поеду на Кавказ либо в Крым. || то же с повторением: либо либо. Или или. «Либо пан, либо пропал.» погов. «Старое общество было основано на таком принципе, что либо ты грабишь другого, либо другой грабит тебя, либо… … Толковый словарь Ушакова

    Либо рыбу съѣсть, либо на мель сѣсть. Ср. Охъ, баринъ, берегись, говорили ему его хозяева: дѣло берешь трудное: съ нимъ либо рыбку съѣсть, либо на мель сѣсть. Данилевскій. Девятый валъ. 3, 27. См. Пан или пропал. См. Либо сена клок, либо вилы в… … Большой толково-фразеологический словарь Михельсона (оригинальная орфография)

    ЛИБО, союз. То же, что или (в 1, 2 и 3 знач.). Л. пан, л. пропал (о том, кто рискует: или всё получит, или всё потеряет). Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова

    ИЛИ, союз. 1. разделительный. употр. при сопоставлении исключающих по значению друг друга членов предложения для указания на необходимость выбора между тем и другим; то же, что либо (в этом знач. постановка или перед каждым членом предложения… … Толковый словарь Ушакова

    ИЛИ, иль, аль союз либо; то есть, иначе, то же; разве, ли. Или то бери, или другое, любое, одно из двух. Сядь, или ляг, как хочешь. | Царь град, или Константинополь, или Византия, равно, одно и то же. | Шурин или женин муж, все одно. Или ты… … Толковый словарь Даля

    Ср. Ох, барин, берегись, говорили ему его хозяева: дело берешь трудное: с ним либо рыбку съесть, либо на мель сесть. Данилевский. Девятый вал. 3, 27. См. пан или пропал. См. либо сена клок, либо вилы в бок … Большой толково-фразеологический словарь Михельсона

    I союз; = иль 1. Употребляется при соотнесении однородных членов предложения или целых предложений (по значению взаимоисключающих или заменяющих друг друга), указывая на необходимость выбора между ними. 2. Употребляется при введении слов и… …

    Союз Употребляется при связи однородных членов предложения и целых предложений (по значению взаимоисключающих или заменяющих друг друга, указывая на необходимость выбора между ними), соответствуя по значению сл.: или. Толковый словарь Ефремовой.… … Современный толковый словарь русского языка Ефремовой

    Основные сведения о насекомых Из общего числа видов животных, населяющих Землю, на долю насекомых приходится около 70%. Число уже описанных видов приближается к миллиону, но ежегодно специалисты открывают и описывают все новые и… … Биологическая энциклопедия

Книги

  • Поцелуй или убей. Убийство на стороне. Так пропала моя любимая. Заказное убийство , Дей Кин , Дей Кин - американский писатель, представитель детективного жанра. Его произведения выходили в таких популярных американских изданиях, как "Черная маска", "Детективные истории" . В данный… Категория: Классика зарубежного детектива Серия: Hot gun ("Дымящийся пистолет") Издатель: Пресса ,
  • Здоровье и стройность за 15 минут, или Бодифлекс меняет жизнь к лучшему , Дубровская С.В. , В данной книге подробно описан несложный, но очень эффективный комплекс оздоровительных упражнений, называемый бодифлексом. Для его проведения не обязательна предварительная подготовка или… Категория: Фитнес Серия: ЗиЖ. Издатель:
© 2024 Helperlife - Строительный портал