Что означает «Условные выражения могут быть только логическими, а не целыми».имею в виду? - PullRequest
4 голосов
/ 14 июня 2010

Что означает «Условные выражения могут быть только логическими, а не целыми». имею в виду? Я не знаю Java, и я знаю, что C ++ явно недостаточно для понимания того, что это значит.

Ответы [ 9 ]

7 голосов
/ 14 июня 2010

Это означает, что вам нужно логическое значение для условного выражения, преобразование из целочисленного типа не будет неявным.Вместо if (x) вам понадобится if (x != 0) и т. Д.

Первым является int, который будет неявно преобразован в bool в C ++ (через != 0), но последнее выражениедает логическое значение напрямую.

6 голосов
/ 14 июня 2010

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

// conditional control structure
if (conditionalExpression) {
    codeThatRunsIfConditionalExpressionIsTrue();
} else {
    codeThatRunsIfConditionalExpressionIsFalse();
}

// basic loop control structure
while (conditionalExpression) {
    codeThatRunsUntilConditionalExpressionIsFalse();
}

// run-at-least-once loop control structure
do {
    codeThatRunsAtLeastOnceUntilConditionalExpressionIsFalse();
} while (conditionalExpression);

С логической точки зрения условные выражения по своей природе являются логическими (истина или ложь).Однако некоторые языки, такие как C и C ++, позволяют использовать числовые выражения или даже указатели в качестве условных выражений.Когда в качестве условного выражения используется не булево выражение, они неявно преобразуются в сравнения с нулем.Например, вы можете написать:

if (numericalExpression) {
    // ...
}

И это будет означать следующее:

if (numericalExpression != 0) {
    // ...
}

Это позволяет получить краткий код, особенно в языках указателей, таких как C и C ++, где тестирование на нульуказатели довольно распространены.Однако, краткий код не обязательно делает его более понятным.В языках высокого уровня, таких как C # или Java, использование числовых выражений в качестве условных выражений недопустимо.Если вы хотите проверить, была ли ссылка на объект инициализирована, вы должны написать:

if (myObject != null) /* (myObject) alone not allowed */ {
    // ...
}

Аналогично, если вы хотите проверить, является ли числовое выражение нулевым, вы должны написать:

if (numericalExpression != 0) /* (numericalExpression) alone not allowed */ {
    // ...
}
4 голосов
/ 14 июня 2010

В C ++ вы можете сказать if (someInt), что в основном эквивалентно if (someInt != 0). В Java допустима только вторая форма.

3 голосов
/ 14 июня 2010

Примите утверждение:

if (a > b) {
    // Do stuff
}

«Условное выражение» равно a > b.В C ++ вы можете делать такие вещи, как

int i = foo();
if (i) {
    // do stuff
}

Это потому, что целые (целочисленные значения) обрабатываются как ложные, когда 0, и истинные в противном случае.Такие языки, как Java, не позволяют таким образом трактовать целые числа как логические значения.

2 голосов
/ 14 июня 2010

Это означает, что в Java булево значение «true» не взаимозаменяемо с целочисленным значением «1» (или, точнее, с любым ненулевым целым числом), а булево значение «false» не является взаимозаменяемымс целочисленным значением "0".

2 голосов
/ 14 июня 2010

В C / C ++ вы можете сделать

int i = 5;
if( i ) { ...}

В Java вы не можете, так как я должен быть логическим

2 голосов
/ 14 июня 2010

Интегральное выражение:

int i = 5;
if(i) {
  //...
}

//In C/C++, if(i) gets implicitly converted to if(i != 0), Java doesn't do this for you.

Булево выражение

int i = 5;
if(i==5) {
  //...
}

//This will work in Java
1 голос
/ 14 июня 2010

Другими словами: C / C ++ не имеет реального логического типа, они просто используют целые числа.У Java они есть - и более того, у них более строгая типизация, чем у C / C ++.

1 голос
/ 14 июня 2010

Выражение - это код, который вычисляет значение. В обоих языках выражение имеет статический тип, который описывает тип значений, которые дает это выражение. Integral означает, что тип выражения является int.

Проще говоря, авторы подчеркивают, что каждое из следующего является допустимым кодом C ++, но не допустимым кодом Java, поскольку выражение if дает целое число:

if (32) {

}

if (2 * 17 - 33) {

}

int c;
if (c = 12) {

}
...