2016-01-06 4 views
24

Я новичок в C# и хочу понять, как работают ценности. Если я посмотрю на нормальное целочисленное значение, в нем есть 3 важные части: тип, имя и значение.C# суффикс за цифровым литералом

int testInt = 3; 
| |  | 
Type Name Value 

Но когда я вижу значение с плавающей запятой, что меня смущает немного из-за суффикса F.

float testFloat = 3.0F; 
    |  |  | | 
Type Name Value Type 

В настоящее время существует два типа в нем, и без суффикса F значение будет двойным. Но почему это происходит, когда я могу объявить двойную переменную с

double testDouble = 3.0D; 

double как первое слово должно быть достаточно, не так ли? То же самое для десятичного значения с индексом М:

decimal testDecimal = 3.0M; 

Затем он начинает действительно смущать меня, когда речь идет о других суффиксов:

ulong bigOne = 2985825802805280508UL; 

Я использовал ulong в тесте до и знаю, что u для «без знака» и позволяет значение в два раза выше, чем обычно. Затем вы получаете U снова как суффикс, а L - буквально, как сказал google. Насколько я понимаю, «литералы» - это типы значений, которые содержат числа. Но я не понимаю, почему этот улунг работает даже без суффикса?

ulong bigOne = 2985825802805280508; 

Тогда я пытался что-то другое, чтобы понять важность суффикса

byte testLong = 12312UL; 

Это не работает, потому что слишком большое значение для байта (254), а суффикс не преобразует его в длинная переменная.

Почему не первое слово (тип) недостаточно для объявления? Первое слово должно быть достаточно, чтобы указать тип. Лучше ли всегда давать значения суффикс?

+3

Вы правы, одно объявление типа достаточно, если есть также задание. Вот почему ключевое слово var было добавлено в C#: https://msdn.microsoft.com/en-us/library/bb383973.aspx – Max

+3

'U' для неподписанных, а не неназначенных. –

+1

А как насчет расчетов вроде 4.0/3? Следует ли использовать одинарную или двойную точность? Это действительно влияет на результат. Или рассмотрите 2000000000 * 3? Это переполнение или просто длинное? Вы не всегда напрямую назначаете значения. – dryman

ответ

24

Вы путаете две разные вещи здесь:

float testFloat = 3.0F; 

float сообщает компилятору, что переменная testFloat Виль значение с плавающей точкой.F сообщает компилятору, что буква3.0 является float. Компилятор должен знать обе части, прежде чем он сможет решить, может ли он назначить литерал переменной без преобразования или неявного преобразования.

Например, вы можете сделать это:

float testFloat = 3; 

И это нормально. Поскольку компилятор увидит 3 как целое число буквально, но он знает, что он может назначить это поплавок без потери точности (это неявное преобразование). Но если вы сделаете это:

float testFloat = 3.0; 

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

float testFloat = 3.0f; 

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

float testFloat = (float)3.0; 
+4

Точно. Если вы выполняете «var result = 4/3;», компилятор должен решить, является ли это целочисленным или поплавковым оператором, и это зависит только от того, что находится на правой стороне оператора присваивания. По умолчанию целочисленные значения считаются «int», а десятичные значения считаются «double». Таким образом, 'result' будет' int' из 1. Если вы делаете '4/3.0' вместо этого,' result' будет 'double' с значением 1.3333333. – Andrew

+0

Теперь я понимаю, спасибо. Я никогда не делал декларации с расчетами в ней. Думал, что точка между цифрами должна быть достаточной для понимания для компилятора. – user3772108

+0

Но даже с примером расчета. Поплавок в начале должен быть достаточным, чтобы сказать, что я хочу поплавок? Потому что байт в Long с просто суффиксом не работает? – user3772108

2

Существует другой способ объявить переменную без указания типа перед именем:

var myNumber = 10; 

В этом случае переменная типа будет определена буквальным значением.

Если вы используете тип (double | float | int | ...) вместо «var», то компилятор преобразует буквенное значение в тип переменной (когда это возможно).

Итак, я считаю, что суффикс важен, когда вы используете «var» для объявления переменных, а тип значения literal не является значением по умолчанию, когда суффикс не используется;

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

+3

Это одна из ситуаций, когда необходимо различать разные числовые литералы через суффиксы, но это не * причина *, и это, конечно, не единственная такая ситуация (в конце концов, «var» было добавлено несколько версий на язык, но необходимость суффиксов была там с самого начала). – Servy

+0

Итак, я могу объявить каждую переменную только с var и правильным суффиксом? – user3772108

+1

@ user3772108 В большинстве случаев да, есть некоторые исключения, которые вы не можете, например, определить Func. Но большинство объявлений можно разрешить с помощью 'var', например:' var arrayOfInt = new [] {1,2,3} '. Нельзя использовать пример: 'Func add = (a, b) => a + b', в этом случае вы должны определить тип переменной. Вы можете узнать больше о 'var' здесь https://msdn.microsoft.com/en-us/library/bb383973.aspx –

10

Все выражения должны быть разрешимы для типа. Таким образом, выражение 42всегда должно иметь точно один тип (это int). Он не может быть int, если вы назначили его переменной int и double, если вы назначили его double. Контекст, в котором используется выражение, никогда не используется . 1 используется для определения того, к какому типу он решает.

Вот почему числовые литералы могут иметь суффиксы; это способ определения типа этого выражения в этом выражении.

Обратите внимание, что есть и неявные преобразования между многими из числовых типов, так что если вы пишете double d = 42; Выражение 42на самом деле целое, но есть неявный оператор преобразования выполняется на нем, который преобразует его в double перед назначением.

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

+0

Ваш ответ и Мэтт Бёрланд помогли мне понять. Большое спасибо за это. – user3772108

+0

@LucasTrzesniewski Совершенно верно. – Servy

 Смежные вопросы

  • Нет связанных вопросов^_^