2015-06-17 4 views
0

Может ли кто-нибудь объяснить объяснение механики нижнего капота x % y !=0 на C++? Он оценивает значение 0, если в целочисленном делении нет остатка, и он оценивается в 1, если имеется остаток от любой суммы. Я считаю, что это очень полезно, но я хотел бы понять, что происходит, поскольку синтаксис для меня неинтуитивный.Механика «x% y! = 0» в C++

Я обнаружил это в отдельном потоке, который у меня нет разрешения на комментарий в:

Fast ceiling of an integer division in C/C++

Спасибо.

(Пожалуйста, простите любые форматирования бестактность, это мой первый иди сюда)

ответ

2

% - оператор целочисленного останова. Например:

  • 21 % 7 == 0
  • 22 % 7 == 1
  • 25 % 7 == 4
  • 27 % 7 == 6
  • 28 % 7 == 0

x % y != 0 истинно, если целочисленное деление дает ненулевой остаток, ложное если он не делает. x % y - это просто остаток; x % y != 0 проверяет, отличен ли этот остаток от нуля.

(Обратите внимание, что x % y != 0 также можно записать в виде (x % y) != 0.)

Это немного сложно, если учесть, отрицательные операнды.

+0

Отрицательные операнды не вызывают сюрпризов, когда результат сравнивается с нолем. –

+0

Ничего себе, эта последняя форма - (x% y)! = 0) - все, что нужно, чтобы по-настоящему щелкнуть - спасибо! – codeling

1

Результатом выражения является булево (через «не-равный-к» бинарный оператор). Поэтому, если результат модуля не равен нулю, результат полного выражения равен 1 (true). Если результат модуля равен нулю, полный результат выражения равен 0 (false)

+0

Самый превосходный - спасибо, сэр! – codeling

0

Ну, похоже, ваша проблема - это modulo operater (%). Так что этот оператор делает, дает вам остаток после того, как мы разделим два числа.

EX. 5 % 2 = 1 Потому что, когда мы берем 5/2 в целочисленном делении, получаем 2, но мы, очевидно, имеем 1 в качестве остатка. Другим примером является 22% 4 = 2 Поскольку 22/4 = 5 с 2 остатками.

Теперь, когда мы это понимаем, мы можем ясно видеть, что если мы получим ненулевое число, выражение x % y != 0 вернет true, так что у нас есть два целых числа, которые не делят друг друга. Если мы получим это как ложное, мы получим два числа, которые делят друг друга. Таким образом, вы действительно имеете это назад, потому что, если целочисленное деление будет успешным без остатка x % y == 0, то 0 != 0 будет ложным.

+0

Спасибо, JackV. Эта проблема возникла именно сегодня, потому что мне нужен был чистый способ добавить дополнительную строку вывода, если целочисленное деление было ненулевым.Теперь я понял, что это логическая операция - опять же, синтаксис для меня был немного загадочным (я опытный инженер сети, а скорее новичок с C++). Все очень, очень полезно - и невероятно быстро! – codeling

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

  • Нет связанных вопросов^_^