Ведет ли && в c++ себя так же, как && в Java?


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

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

for(int i=0; i<10; i++)
{
   if(i < list.size() && list.get(i) == 5)
       //do something
   ...
}
Это не совсем точный код, но он иллюстрирует суть. Я предполагаю, что поскольку я > размер списка, вторая половина не будет оценена. Но похоже, что это все еще так, и я считаю, что это вызывает ошибку Seg. Я знаю, что могу использовать вложенные "Если", но это такое бельмо на глазу и пустая трата места. Помощь есть?
6 3

6 ответов:

Да, в C и C++ операторы && и / / закорачиваются.

Срезок работает одинаково в C, C++ и Java.

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

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

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

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

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

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

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