2015-12-14 2 views
6

Я хочу утверждать, что неподписанный int строго положителен. Я обсуждала между следующими двумя вариантами:Является ли uint строго положительным

unsigned int i = 1; 
assert(i > 0); /*option 1*/ 
assert(i != 0); /*option 2*/ 

я обнаружил, что застрял в Buridan's ass дилемме. Есть ли какая-то причина предпочитать одну над другой?

+3

'unsigned int' может быть' 0'. – birryree

+1

Я знаю. Вот почему мне нужно утверждать. –

+0

Это все еще может быть 0 – ColdSteel

ответ

6

assert(i > 0); более читабельны для других программистов, для которых i проверяется на целые положительные числа и включает в себя корпус для i = 0.


Примечание: Как Joachim отметил в своем comment, что иметь в виду, что если макрос NDEBUG был определен в момент <assert.h> был последний включен, макрос assert() не генерирует код, и, следовательно, не делает вообще ничего ,

3

Я предпочитаю

assert(i > 0); /*option 1*/ 

по 2 причинам.

Во-первых, это еще один персонаж, а персонажи стоят денег.

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

+0

Ну, вам нужно будет знать, что он неподписан, поэтому вы знаете, что вам не нужно будет тестировать отрицательные значения. –

+1

Моя точка зрения была, если я хочу, чтобы число было строго положительным, оно строго положительное с опцией 1, является ли число неподписанным или нет. С вариантом 2 он также строго позитивен, но мне нужна дополнительная информация, чтобы подтвердить это при просмотре кода. –

2

И, конечно, порождает один и тот же код, чтобы все, что передает цель общей функции в является лучшим выбором:

unsigned int i = ...; 
assert(i > 0); /*option 1*/ 
assert(i != 0); /*option 2*/ 

Вариант 1 работает лучше в большинстве случаев, как это положительное утверждение: что должно быть значением в отличие от того, чего не должно быть. Обычно это легче понять. Также, когда тестируется арифметический характер i, это путь.

Вариант 2 работает лучше в ограниченных случаях, когда i используется исключительно для его нулевого или ненулевого значения, особенно если он представляет собой набор логических битов, арифметическое значение которых не имеет значения.

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