2013-07-09 4 views
3

Есть ли существенная разница между следующим кодом:разницы в кодировании стиля

for(int i=0;i<100;i++){ 
    int s =i; 
} 

и

int s=0; 
for(int i=0;i<100;i++){ 
    s =i; 
} 
+2

Пожалуйста, для любви к другим, научитесь использовать пробелы после запятой в выражении if. Фактически, пробелы между именами переменных, операторами присваивания и значениями присвоения тоже не так уж и плохи! И кто учит, что «для (« хороший стиль? »Для» является ключевым словом, и вы не должны делать его похожим на вызов метода. –

ответ

6

Есть ли существенная разница между следующим кодом:

Просто разница в размере int s. В первом случае он не будет виден вне цикла for. Принимая во внимание, что это будет в последнем случае. Что касается наилучшей практики, вы должны попытаться до свести к минимуму область локальных переменных, насколько это возможно. Итак, если вы не используете int s вне цикла for, тогда лучше объявить его только внутри.

+0

«проблема с областью». Это что-то, что «int s = i» будет повторно инициализировать s снова и снова, и если «int s» находится за его пределами, это будет предотвращено. – manish

+0

@Manish. Во втором случае 's' будет повторно инициализирован в каждом цикле. В первом случае вы повторно объявляете переменная вообще –

+0

, так в чем же разница между «переинициализированным» и «повторным объявлением» здесь. Будут ли некоторые проблемы возникать при работе с большим циклом – manish

-1

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

2

Если нет никакой пользы от S вне цикла, то я предпочитаю первый

for(int i=0;i<100;i++){ 
    String s =i; 
} 

Поскольку

Область локальных переменных всегда должно быть наименьшим возможным

поскольку

  • Это упрощает код t o понимать, отлаживать и рефакторировать.
  • Память, необходимая для этих переменных в обоих случаях, очень мала.

Кроме этого нет существенного различия между этим два

Для детального ответа вы можете проверить this so thread

+5

-1. Я смущен этим: почему объявление 'String s' * вне * цикла' for' («если нет использования s вне цикла») приводит к * уменьшению * области? Разве это не назад? –

+1

@CraigOtis .. оооооооооооооооооооооонять ответить на основе первого ... извините за ошибку ... Скопировать вставку – stinepike

0

Объявива int внутри петель for, его объем определяется контуром for , Поэтому он не будет доступен вне цикла.

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

-2

Единственное отличие, которое я вижу в обоих случаях, в первом примере Строка s будет локальной для цикла for. Во втором примере строки String могут быть доступны и вне цикла.

0

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

Компилятор также знает, что тривиально, поэтому он может выполнять некоторую оптимизацию, например.

void foo() 
{ 

    for(int i=0;i<100;i++) 
    { 
     String s = ""+i; 
    } 

    for(int i=0;i<100;i++) 
    { 
     Long x = i; 
    } 
} 

Только один местный слот стека необходим для s и x, так как s и x никогда не будут нужны в то же время.

Это не будет столь очевидным для компилятора, если s и x в внешней области

void foo() 
{ 
    String s; 
    Long x; 

    for(int i=0;i<100;i++) 
    { 
     s = ""+i; 
    } 

    for(int i=0;i<100;i++) 
    { 
     x = i; 
    } 
} 
-2

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

+0

Здесь ничего не создается, и, вероятно, не будет разницы в производительности между этими двумя фрагментами. – arshajii

0

Как уже упоминалось, единственным функциональным отличием является область действия. С строкой, объявленной вне цикла for, она доступна вне цикла. Объявленный внутри цикла, он доступен только внутри цикла.

Однако, это немного больше: когда вы делаете переменную доступной вне цикла, вы подразумеваете, что она должна быть должна быть доступ к внешней линии. Поэтому, если это не, доступный позже в методе, это может поднять вопрос в голове читателя вашего кода о том, забыли ли вы его использовать, или если импликация неверна. Поэтому становится более читаемым, если вы объявляете строку так, чтобы она имела ограниченную область, насколько это возможно, когда/где она будет использоваться.

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