Почему Java и C# не имеют неявных преобразований в булевскую переменную?

Чтобы прочитать файл ...

set /P Variable=<File.txt

Чтобы записать файл

@echo %DataToWrite%>File.txt

note; с пробелами перед символом & lt;> вызывает добавление пробела в конце переменной, также

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

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

, ваш журнал будет выглядеть следующим образом:

Entry1
Entry2 

и т. д.

В любом случае пара полезных вещей

27
задан Shaun 1 June 2010 в 17:06
поделиться

7 ответов

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

3
ответ дан ChaosPandion 28 November 2019 в 04:09
поделиться

Для ясности. Это делает следующую ошибку просто недопустимой:

int x = ...;

if (x = 0)  // in C: assign 0 to x and always evaluate to false 
   ....     // never executed

Примечание: большинство современных компиляторов C / C ++ выдают предупреждение (но не ошибку) в отношении этого простого шаблона, но существует множество возможных вариантов. Это может подкрасться к вам.

37
ответ дан 28 November 2019 в 04:09
поделиться

Может быть, они чувствовали, что более явная формулировка больше соответствует строго типизированному языку.

10
ответ дан 28 November 2019 в 04:09
поделиться

И Java, и C # отказались от неявных преобразований в логические значения , чтобы снизить вероятность ошибки программиста .

Например, многие программисты случайно напишут:

if( x = 5 ) { ... }

вместо:

if( x == 5 ) { ... }

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

if( 5 = x ) { ... } // doesn't compile.

Теперь в C # вы все еще можете создавать операторы неявного преобразования в bool для своих собственных типов - хотя это редко рекомендуется, поскольку большинство разработчиков этого не ожидают:

public class MyValue
{
   public int Value { get; set; }

   public static implicit operator bool( MyValue mb )
   {
       return mb.Value != 0;
   }
}

MyValue x = new MyValue() { Value = 10; }
if( x ) { ... } // perfectly legal, compiler applies implicit conversion
32
ответ дан 28 November 2019 в 04:09
поделиться

У вас все наоборот.
На самом деле C не поддерживает boolean, поэтому if (и любой другой условный оператор) на самом деле ожидает значение int, а не boolean. Тогда значение int, равное 0, рассматривается как false, а любое другое значение - как true.

Некоторые люди на самом деле находят это немного двусмысленным, потому что такое поведение может привести к множеству ошибок, как отмечали другие. Из-за этого разработчики Java отказались от поддержки только булевых типов в операторах условия. И когда Microsoft решила реализовать MS-Java (AKA C#), они позаимствовали этот принцип проектирования.

Если вам это не нравится, вы можете программировать на различных языках, которые не имеют этого ограничения.

8
ответ дан 28 November 2019 в 04:09
поделиться

Некоторые языки программирования вообще не делают автоматического принуждения. Целое число, например, можно сравнивать только с другим целым числом; присваивание нецелочисленной переменной приводит к ошибке. Это отличительная черта языка с сильной типизацией.

То, что Java делает любое принуждение, является удобством для вас и нарушает модель сильной типизации.

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

  • Какие значения отображаются на false и true? Если вы C, то только ноль отображается на false, а все остальные значения - на true. Если вы - оболочка bash, то все наоборот.
  • Как должны отображаться отрицательные значения?

Когда вы пытаетесь автоматически преобразовать двойное число в целое, Java отмечает это как ошибку "потери точности". По аналогии, преобразование числа в булево число также должно приводить к потере точности. Однако Java предпочла не поддерживать это синтаксически.

2
ответ дан 28 November 2019 в 04:09
поделиться

Неявное преобразование любого значения int (например, (flags & 0x80)) в логическое значение подразумевает определенное языком отображение из значения int в логическое значение.C сделал это и вызвал огромное количество путаницы и много ошибок программиста. Нет веской причины, по которой нулевое значение int ВСЕГДА означает истину (или ложь), и существует множество веских причин, по которым вы можете оставить решение на усмотрение программиста. По этим причинам в большинстве современных языков отказались от неявного преобразования в логическое значение.

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

6
ответ дан 28 November 2019 в 04:09
поделиться