2010-10-05 2 views
3

мой вопрос по существу в названии. В основном я узнал, что в Java оператор & & действует как короткое замыкание, так что если первое условие оценивается как false, оно не рассматривает остальную часть инструкции. Я предположил, что это было в C++, но я пишу немного кода, который сначала проверяет, что индекс не превысил размер списка, а затем сравнивает этот индекс в списке с другим номером. Что-то вроде:Имеет ли && в C++ поведение так же, как && в Java?

//let's say list.size()=4; 

for(int i=0; i<10; i++) 
{ 
    if(i < list.size() && list.get(i) == 5) 
     //do something 
    ... 
} 

Это не точный код, но он иллюстрирует точку. Я предполагаю, что, поскольку i> размер списка, вторая половина не будет оцениваться. Но похоже, что это все еще происходит, и я считаю, что это вызывает Seg Fault. Я знаю, что могу использовать вложенные ifs, но это такое бельмо на глазу и пустая трата пространства. Любая помощь?

+0

Я не уверен, что это правильно для Java или C++. По моему опыту оцениваются все условия в одном условии if. –

+0

Спасибо за ответы ребята. Я не знаю, что еще может быть проблемой. Я собираюсь вернуться, ударяя головой о стол ... – vince88

+10

@Brian: Я бы предположил, что у вас нет опыта работы с Java или C++. –

ответ

2

C++ & & и || операторы также делают короткое замыкание. Будьте осторожны, возможно, вы ставите один &, а C++ использует двоичный код и оператор, который не является короткозамкнутым. Если вам нужна дополнительная помощь, отправьте более соответствующий код.

1

C++ короткое замыкание & & и || как Java. в if(i < list.size() && list.get(i)), list.get(i) не будет оцениваться, если i < list.size() является ложным.

5

Ярлыки работают одинаково на языках C, C++ и Java.

Однако, с учетом кода примера, вы можете получить segfault, если list - null. C++ не имеет эквивалента NullPointerException Java. Если список может быть нулевым, вам нужно также проверить его.

Обновлено Последняя половина этого применяется только в том случае, если список является указателем. (Который не кажется.) Если бы это было так, это будет выглядеть так:

if (list && i < list->size() && list->get(i) == 5) 
+0

Я не знал, что вы можете проверить, что что-то не так. Спасибо за информацию. – vince88

+0

@ user391369: Вы не можете в Java, но можете в C++. В Java вам нужно сделать это логическим выражением ('if (list! = Null && ...'). –

+1

Основываясь на использовании 'list.size()', кажется, что 'list' не является указателем в этом случае, так что тестирование на null не сработает. – GBegen

3

Да && ведет себя так же в Java, как и в C++. Это оператор короткого замыкания, а также последовательность точек [в C++]. Порядок оценки операндов определен корректно слева направо.

1

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

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