2014-05-19 6 views
3

цикл в CЕсть ли разница между циклами в java и c?

int i; 
int n = 20; 
for(i = 0; i + n; i--) { 
    printf("-\n"); 

} 

для петли в Java

int i; 
int n=20; 
for (i = 0; i + n; i--) { 
    System.out.println("-\n"); 
} 

В приведенном выше примере для цикла в C работает нормально (будет печатать "-" 20 раз) .Но for loop in java показывает ошибку как

Исключение в теме "main" java.lang.Error: Неразрешенная проблема компиляции: Тип несоответствия: не может конвертировать из int в boolean

Почему он показывает такую ​​ошибку?

+0

Вам не нужно объявлять i перед петлей – PKlumpp

+2

@ ZerO вы уверены? – DnR

+0

@ DnR зачем мне это нужно? Только если мне нужно получить доступ к i после цикла, и он этого не сделает. И, кстати, я не понимаю его условия перерыва. никогда не видел этого в java. но уже есть ответ на этот вопрос: – PKlumpp

ответ

10

В C 0 считается false, а остальная часть - true. В Java это не работает, поскольку у него есть тип boolean, который не является int, а int не может быть напрямую преобразован в boolean.

Чтобы исправить код Java, вы должны написать вторую часть как boolean выражение:

for (i = 0; (i + n) != 0; i--) { 
    System.out.println("-\n"); 
} 

Хотя (i + n) != 0 может работать, я бы предпочел использовать (i + n) > 0, потому что если n начинается в -1, этот цикл будет работа до i снижается до Integer.MIN_VALUE значение, доходит до Integer.MAX_VALUE и спускается до 1. Чтобы предотвратить такое поведение (в случае нежелательна), было бы лучше, чтобы написать это:

for (i = 0; (i + n) > 0; i--) { 
    System.out.println("-\n"); 
} 

От @ комментарий Лундин, в выглядит ваш код C должен быть установлен, а также:

//or use my proposed fix by using > rather than != 
for(i = 0; (i + n) != 0; i--) { 
    printf("-\n"); 
} 
+4

В C я считаю, что любое * отличное от нуля значение имеет значение true (а не только положительные числа). –

+0

Чтобы сохранить управляющие операторы как «эффективно» логические, рекомендуется применять на C так что не только код Java должен быть исправлен, как показано здесь, но и код C! Это, например, требуется MISRA-C. – Lundin

+0

@ Lundin point, thanks. –

3

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

Но Java более строг относительно того, что является логическим и что является целым числом - вам действительно нужно использовать логическое выражение (например, i + n != 0), чтобы проверить, должен ли цикл продолжаться.

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