Что делает этот код?

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Что делает этот код?

Сообщение Bizdelnick »

Начал ощущать, что мой любимый wmii как-то подзаброшен всеми, и решил полюбопытствовать, что там у него в исходниках и, может быть, даже попытаться исправить кой-какие глюки. Апстрим как таковой, видимо, перестал существовать, но на гитхабе нашлось несколько клонов. Код там, как выяснилось, не самый читабельный, а вот эта конструкция вообще для меня непонятна:

Код: Выделить всё

            ixp_srv_writebuf(r, (char*[]){ structptr(f->p.ref, char, t->buffer) },
                     t->size ? structptr(f->p.ref, uint, t->size)
                             : (uint[]){ strlen(structptr(f->p.ref, char, t->buffer)) },
                     t->max);

То есть я в принципе такого синтаксиса не знаю. И не только я: vim подсвечивает красным открывающие фигурные скобки, а cppcheck говорит
[cmd/wmii/fs.c:519]: (warning) Return value of function strlen() is not used.

Однако же оно как-то компилируется, значит синтаксически корректно. Отсюда два вопроса: как оно работает, и как автор хотел, чтобы оно работало?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Что делает этот код?

Сообщение Stauffenberg »

То есть я в принципе такого синтаксиса не знаю.

Так а что именно не понятно? Тернарная операция? Или передача параметров?

Код: Выделить всё

#include <stdio.h>

int main()
{
   int a , b;

   a = 10;
   printf( "Value of b is %d\n", (a == 1) ? 20: 30 );
   printf( "Value of b is %d\n", (a == 10) ? 20: 30 );
   return 0;
}


Код: Выделить всё

Value of b is 30
Value of b is 20
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что делает этот код?

Сообщение Bizdelnick »

Да не, с тернарной операцией как раз всё ясно. Мне непонятен код вида (тип){ выражение }. Если (тип) — это приведение типа, то что даёт выражение в фигурных скобках? Или это что-то совсем другое?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Что делает этот код?

Сообщение alkesta »

Bizdelnick писал(а):
21.12.2016 22:22
Если (тип) — это приведение типа, то что даёт выражение в фигурных скобках? Или это что-то совсем другое?

По-моему, фигурные скобки здесь ничего не значат и их можно убрать.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что делает этот код?

Сообщение Bizdelnick »

Так, всё. Перестал тупить. Это таким образом создаётся массив из одного элемента, то есть фактически берётся указатель.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Что делает этот код?

Сообщение Stauffenberg »

Bizdelnick писал(а):
21.12.2016 22:22
Если (тип) — это приведение типа, то что даёт выражение в фигурных скобках? Или это что-то совсем другое?

strlen должен int вернуть, т.е. длину того, что ей вернет structptr(). Вообще, писать в таком функциональном стиле на С, да еще и конвертировать типы возвращаемых данных, не проверяя перед этим эти самые возвращаемые данные, - не самая лучшая затея.

alkesta писал(а):
21.12.2016 23:24
Bizdelnick писал(а):
21.12.2016 22:22
Если (тип) — это приведение типа, то что даёт выражение в фигурных скобках? Или это что-то совсем другое?

По-моему, фигурные скобки здесь ничего не значат и их можно убрать.

Я тоже сначала так подумал. Вроди бы это наследие стандарта C89.

Но вот задачка на ночь :)

Код: Выделить всё

#include <stdio.h>

int main()
{
  float x, y, z;
  x = 7/5;
  y = (float) 7/5;
  z = (float) {7/5};
  printf("%f\n%f\n%f\n",x, y, z);
  return 0;
}

Код возвращает

Код: Выделить всё

1.000000
1.400000
1.000000

Т.е. выражение из фигурных скобок (z) возращает отличное (от y) значение. Вот это мне не совсем понятно.

Если написать 7/5.0, то все будет 1.400000.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Что делает этот код?

Сообщение NickLion »

Bizdelnick
Ну, уже разобрались. Правда код все-равно вылядит немного запутанным.

Stauffenberg
Так всё логично.

Код: Выделить всё

y = (float) 7/5;

Приоритетность операций:

Код: Выделить всё

y = ((float) 7) / 5;

Т.е. вещественная 7 делится на целую 5, что даёт вещественные 1.4.
В случае z и 7, и 5 — целые, результат — целая 1. А потом уже 1 инстанциируется как float.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Что делает этот код?

Сообщение Stauffenberg »

NickLion
Точно. Спасибо :)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Ответить