Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка с помощью If

22K
29 марта 2007 года
new_for_coding
4 / / 01.02.2007
Доброго всем дня!

Есть вот такая конструкция:
 
Код:
abl_args *args;

if (args = malloc(sizeof(abl_args)), NULL == args) {..}

Я правильно понимаю, что в ней выделяется память для структуры abl_args и проверяется выделена ли она? Первую часть условия для читабельности можно было вынести отдельно? Прокомментируйте пожалуйста с точки зрения правильности и красивости.


Заранее большое спасибо.
3
29 марта 2007 года
Green
4.8K / / 20.01.2000
Да, ты правильно понимаешь.
С точки зрения красивости код безобразен: нечитабелен, зачем-то дважды проверяется практически одно и тоже условие.
С точки зрения читабельности не просто можно, а нужно выносить первую часть за пределы if.
Для сравнения, что читабельнее?
 
Код:
abl_args* args = malloc(sizeof abl_args);

if (NULL == args) {..}
26K
29 марта 2007 года
powt.63kvv
8 / / 08.03.2007
а какое условие дважды тут проверяется? вроде единожды, ведь в Си(при конструкции сложных условий) точто пишется в скобках условия игнорится(тупо выполнятеся.. не проверсяется) кроме того что написанно после последней запитой... при таком раскладе всю прогу можно в скобки запихать.. тока какие от этого плюсы?
3
29 марта 2007 года
Green
4.8K / / 20.01.2000
Цитата: powt.63kvv
а какое условие дважды тут проверяется? вроде единожды, ведь в Си(при конструкции сложных условий) точто пишется в скобках условия игнорится(тупо выполнятеся.. не проверсяется) кроме того что написанно после последней запитой...


Да, согласен.

21K
06 апреля 2007 года
Flyer
3 / / 03.12.2006
этого вполге хватит :cool:

abl_args *args;

if (args = malloc(sizeof(abl_args))) {..}
3
06 апреля 2007 года
Green
4.8K / / 20.01.2000
Ну нафига писать такой нечитабельный код?
Скажи, ну чем это лучше, чем
 
Код:
abl_args* args = malloc(sizeof abl_args);
if (NULL == args) {..}

Кроме того, так, как ты привел, писать плохо, т.к. нормальный компилятор будет варнинг выбрасывать: "не имел ли ты в виду == вместо =".
502
06 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]Ну почему же нечитаемый.... просто трудно читаемый и всё!
Цитата:
не имел ли ты в виду == вместо =.


Думаю не имел. В данном случае если с помощь функции malloc возвращается указатель на свободную область памяти отведённую под abl_args(число отличное от нулю), то условие проверки if() удовлетворяется и происходит вход {}. Если же память по каким либо причинам не высвобождается для этого объекта, то возвращается нулевой указатель, условие if()
не удовлетворятеся со всеми вытекающими последствиями))))
[/LEFT]

3
06 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: Jail

Цитата:

не имел ли ты в виду == вместо =.


Думаю не имел. В данном случае если с помощь функции malloc возвращается указатель на свободную область памяти отведённую под abl_args(число отличное от нулю), то условие проверки if() удовлетворяется и происходит вход {}. Если же память по каким либо причинам не высвобождается для этого объекта, то возвращается нулевой указатель, условие if()
не удовлетворятеся со всеми вытекающими последствиями))))


Это ты с компилятором разговариваешь, который такой варнинг выбросил?
Ну и как уговорил компилятор? :)

502
06 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
Ну и как уговорил компилятор? :)


А у меня

Цитата:
т.к. нормальный компилятор будет варнинг выбрасывать:

ненормальный компилятор, но мы с ним дружим и понимаем друг друга))) :D
Ну лады.... после вот этой конструкции:

 
Код:
abl_args* args = malloc(sizeof abl_args);


зачем писать вот так:
 
Код:
if (NULL == args) {..}


когда можно вот так:
 
Код:
if (args) {..}
Или эта констракшэн невозможна по твоему???

[/LEFT]
3
06 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: Jail

зачем писать вот так:
 
Код:
if (NULL == args) {..}


когда можно вот так:
 
Код:
if (args) {..}
Или эта констракшэн невозможна по твоему???


В С++ это (NULL == args) "хороший тон".

309
07 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
[quote=Jail]
зачем писать вот так:

Код:
if (NULL == args) {..}
когда можно вот так:

Код:
if (args) {..}
[/quote]
Элементарно, в первом случае условие "если ноль", а во втором "если есть" ("если не ноль")
3
07 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: el scorpio
Элементарно, в первом случае условие "если ноль", а во втором "если есть" ("если не ноль")


Думаю, Jail опечатался и имел в виду if(!args).

350
09 апреля 2007 года
cheburator
589 / / 01.06.2006
Цитата: Flyer
этого вполге хватит :cool:

abl_args *args;

if (args = malloc(sizeof(abl_args))) {..}



Следует напомнить, что на некоторых компиляторах подобная запись может вызвать warning типа "а может, ты имел в виду == ?".

if ((args = malloc(sizeof(abl_args))) == NULL) {..} будет безопаснее.

3
09 апреля 2007 года
Green
4.8K / / 20.01.2000
Но ещё более нечитабельным... :)
502
09 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
Думаю, Jail опечатался и имел в виду if(!args).


Тут скорее что проверяем. Проверка на "если есть" или проверка на "если нет". :)

Цитата:
Но ещё более нечитабельным... :)


Ну для новичков да.... Но для тебя то Green..... :)[/LEFT]

240
10 апреля 2007 года
aks
2.5K / / 14.07.2006
Цитата: Jail
[LEFT]
Ну для новичков да.... Но для тебя то Green..... :)[/LEFT]


Код может быть или читабельным или нет. И неважно для кого. Новичек просто может в нем не разобраться, а опытный программист разберется. Но это не делает код более читабельным и оправдывающим такой подход )

502
11 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
Код может быть или читабельным или нет. И неважно для кого. Новичек просто может в нем не разобраться, а опытный программист разберется. Но это не делает код более читабельным и оправдывающим такой подход )


Ну если вы этот код видете ничетаемым,то я не знаю......
Что уж тогда говорить например о перегрузке операторов в С++))) :D Тоже нечитаемо???
Допустим я использую в определении класса чисто виртуальную функцию для вывода в выходной поток. В классах наследуемых базовый класс переопределяю эту функцию (полиморфизм в работе!). Перегружаю оператор '<<', реализуя его как не функцию-членн и вызываю из него эту виртуальную функцию, которая в соответствии с переданным по ссылке объектом вызывает нужную мне функцию)))))))

 
Код:
ostream& operator << (ostream& out, MyClass& d)
{
    d.display(out);  //Вобщем сама виртуальная функция,     реализуемая в каждом классе
    return out;
}

По вашему это тоже нечитаемо??????
А мне так удобно и пользуюсь этим примером постоянно. Это очень сокращает код (хотя кому-то это может показаться просто ужастно и нечитаемо!). :D
[/LEFT]
3
11 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: Jail

Ну если вы этот код видете ничетаемым,то я не знаю......
Что уж тогда говорить например о перегрузке операторов в С++))) :D Тоже нечитаемо???


Не понимаю, при чем тут это?

Цитата: Jail

Перегружаю оператор '<<', реализуя его как не функцию-членн


А по другому у тебя и не получится.

Цитата: Jail

А мне так удобно и пользуюсь этим примером постоянно. Это очень сокращает код (хотя кому-то это может показаться просто ужастно и нечитаемо!). :D


При чем тут нечитаемость?
У меня создается впечатление, что ты, просто, нашел на твой взгляд подходящий пост, чтоб показать какую крутую технику ты применяешь.
Только к нечитаемости это никакого отношения не имеет и техника вполне элементарная, обсуждалась здесь не раз:
http://forum.codenet.ru/showthread.php?t=31233
http://forum.codenet.ru/showthread.php?t=35755

502
11 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
У меня создается впечатление, что ты, просто, нашел на твой взгляд подходящий пост, чтоб показать какую крутую технику ты применяешь.


Да причом тут крутая техника, это многие используют))) :)
Я просто привёл пример который может оказаться(думаю и является) потяжелее, чем приведённое до этого выражение.
Вроде такого рода выражения повсеместно применяются программистами на 'C', возможно я и неправ, но примеры подобного кода видел не раз, поэтому и возражаю вашему мнению о нечитабельности))))) :)
[/LEFT]

4.9K
11 апреля 2007 года
efferson
57 / / 08.12.2005
Похоже тема плавно перешла к вопросу стиля оформления кода :)

Лично я бы написал это как
 
Код:
abl_args *args;

if ( ( args = malloc( sizeof( abl_args ) )  == NULL )
{
   //Вызов какого-нибудь самопального обработчика исключительных ситуаций
}
9.5K
11 апреля 2007 года
ROLpogo
80 / / 22.08.2006
Я бы предпочёл такую запись: :)

 
Код:
abl_args  *args = malloc( sizeof( abl_args ) );
if ( !args )
{
  // ...
}
3
11 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: efferson
Похоже тема плавно перешла к вопросу стиля оформления кода :)

Лично я бы написал это как
 
Код:
abl_args *args;

if ( ( args = malloc( sizeof( abl_args ) )  == NULL )
{
   //Вызов какого-нибудь самопального обработчика исключительных ситуаций
}


А ты можешь аргументировать в чем предпочтительность такой нечитабельной записи?

92
12 апреля 2007 года
Тень Пса
2.2K / / 19.10.2006
вот спор ))) ну просто не о чём )

я согласен с тем, что чем больше скобок в одной строке, тем сложнее порой за ними уследить ))))))) бывает такое %)

а читабельность, о которой говорит Green, я так полагаю не заставляет страдать скорость при review кода, вот и всё... собственно этим и удобнее. чтобы потом самому через некоторое время не путаться, ну и другим (если код дорабатываться будет не только Вами) :)

ИМХО
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог