2013-09-22 4 views
1

Я программировал C# в течение нескольких месяцев, но до сих пор я никогда не сталкивался с этим; что означает эта инструкция?Как интерпретировать эту инициализацию int?

int a = 1, b; 
+0

Этот вопрос не соответствует теме, поскольку он не соответствует стандартам, установленным сайтом. –

ответ

8

Это так же, как:

int a = 1; 
int b; 
1

а и б представляют собой целые числа

и значение-х один. б не имеет значения еще

+0

b имеет значение 0 – VladL

+0

@ Vlad, которое зависит от того, являются ли они полями или местными жителями. Если они являются локальными, они не имеют определенного значения. Какое значение * на самом деле * зависит от реализации CLI. Не существует требуемой ценности с точки зрения языка. Но, как правило, он будет равен нулю, если вы заглянете под обложки, но по причинам, которые делают «значение 0» вводящим в заблуждение, ИМО. –

2

Он определяет типа Integer «а» и «б» дает значение 1 к

+0

Он определяет, но не инициализирует 'b'. – hyde

+0

Вы правы, плохой выбор слов на моей стороне :) –

4

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

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

Это означает, что

int a=1, b; 

указывает, что a и b и имеет тип же данных, напр int вместе с инициализируем переменную a со значением 1 и b имеет по умолчанию INT значение т.е. 0

Так эквивалентно, вы можете написать его как

int a=1; 
int b; 
+1

Можем ли мы сказать, что b имеет значение нуля, полностью зависит от того, является ли это полем или локальным –

+1

Если 'b' является локальной переменной, то это делает не имеет значения 0, поскольку локальные переменные не инициализируются значением по умолчанию. Вы даже не можете прочитать значение 'b' до тех пор, пока оно не будет определено определенно, поэтому' int b; Console.WriteLine (b); 'не будет компилироваться. – Lee

+1

@ Хорошо, на самом деле мы * можем * найти значение (путем обмана - не может это сделать только с C#), и, как это бывает, значение будет равно нулю в MS .NET CLI. Но для этого нужно использовать детали реализации. Только на уровне языка: действительно, он не имеет определенного значения –

3

Это зависит от того, являются ли они «местными» (переменными метода) или «полями» (переменными экземпляра).

Для полей он объявляет a и b как Int32; они инициализируются до нуля, когда память стирается (newobj/initobj) до вызова вызываемого конструктора, а затем в начале конструктора присваивается значение 1.

Для местных жителей он объявляет a и b как Int32 и сразу присваивает 1. B не имеет определенного значения. Правила «определенного присвоения» означают, что не обязательно иметь определенное значение. Однако все значения в стеке должны иметь значение , а значение - и мы могли бы получить это значение путем обмана (например, написания метода в IL, который реализует «out», а просто разыгрывает адрес). Фактическое значение зависит от того, установлен ли флаг init-locals. Это не функция языка C#, но текущий компилятор включает этот флаг. Это означает, что пространство памяти для локальных сетей стирается (устанавливается на ноль) в начале метода. Таким образом, логическое значение будет равно нулю, но по разным причинам. Для этого нет необходимости, так что это полностью детализация реализации.

1

a был объявлен и инициализирован нулем, пока b только что объявлен.

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