Действует ли && в c ++ так же, как && в Java? - PullRequest
3 голосов
/ 05 октября 2010

мой вопрос по сути в названии.В основном я узнал, что в 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
   ...
}

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

Ответы [ 6 ]

6 голосов
/ 05 октября 2010

Да, в C и C ++ символы && и ||операторы короткого замыкания.

5 голосов
/ 05 октября 2010

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

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

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

if (list && i < list->size() && list->get(i) == 5)
3 голосов
/ 05 октября 2010

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

2 голосов
/ 05 октября 2010

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

1 голос
/ 05 октября 2010

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

1 голос
/ 05 октября 2010

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

...