Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Const14, вы написали много чего, но ответа на мой вопрос не дали: в чем смысл подобных замен? в чем смысл выражения, состоящего из нескольких независимых выражений, если результатом такого составного выражения будет только одно значение, а остальные не востребуются?
VladislavS писал(а):Значит имеет право быть
да и хрен бы с ним. вопрос - ЗАЧЕМ это разрешено синтаксисом? ведь какой-то смысл должен быть в каждой фиче?

Добавлено after 2 minutes 58 seconds:
да, как-то не привык разделять термины оператор и операция. согласен, корректно было спросить про операцию "запятая".
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Чтобы использовать составные выражения там где синтаксисом предусмотрено ОДНО выражение.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не понимаю

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

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Нормальным программистам это позволяет "использовать составные выражения там где синтаксисом предусмотрено ОДНО выражение". А тебе да, для ошибок.
Может лучше Денниса Ритчи спросить?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 18
Зарегистрирован: Чт авг 06, 2015 09:38:22
Откуда: Москва

Сообщение Const14 »

Вероятно Вы знаете, что есть такое понятие, как грамматика языка. В грамматику выражений языка C включена операция "," в частности для того, чтобы можно было использовать такие выражения в операторе цикла "for". Соответственно, везде, где язык допускает использовать выражения, они могут быть записаны без каких-либо ограничений. Это унификация. Но Вас никто не обязывает это делать.

Добавлено after 1 minute 44 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3473371#p3473371"]Может лучше Денниса Ритчи спросить?[/uquote]
Вряд-ли это возможно. Он уже давно ушёл в мир иной.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Const14",url="/forum/viewtopic.php?p=3473374#p3473374"]Вряд-ли это возможно. Он уже давно ушёл в мир иной.[/uquote]Естественно, в переносном смысле. Благо он оставил прекрасные книги по языку, в которых любой хрюндель найдёт ответы на свои вопросы.
Последний раз редактировалось VladislavS Пт окт 05, 2018 09:16:07, всего редактировалось 1 раз.
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Роман, при всём уважении, но у Вас похоже "зудит" при отсутствии активности на форуме. Вместо того, чтобы провести приятно время, занявшись каким-либо полезным и любимым делом, Вы очередной раз начинаете разводить демагогию.
PS: Прошу прощения, если форма моего сообщения была оскорбительной. Но иной, способной выразить мою мысль, в моей голове не сложилось.

-------------------------
Тему почистил.
Родился
Сообщения: 18
Зарегистрирован: Чт авг 06, 2015 09:38:22
Откуда: Москва

Сообщение Const14 »

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

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

if( a[i]<b[j] )
{
   t = a[i];
   a[i] = b[j];
   b[j] = t;
}
В данном примере кажется логичным представить составной оператор перестановки в виде одного:

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

if( a[i]<b[j] )
    t = a[i], a[i] = b[j], b[j] = t;
На этом умолкаю.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Const14 писал(а):В данном примере кажется логичным представить составной оператор перестановки в виде одного
В одну строку также можно написать.

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

if( a[i]<b[j] )
    {t = a[i]; a[i] = b[j]; b[j] = t;}
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

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

Но у меня тоже есть вопрос. Тут я всё пытаюсь разобраться, что является объектом, что описанием. С простыми переменными всё просто - уже более-менее научился. А вот как быть со структурами и объединениями. Пример:

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

struct flag {
  unsigned char dst_enable: 1;  // вкл. перехода на летнее время
  unsigned char leadingzero:1;
};
  
union {
  unsigned char eflag;
  struct flag   fflag;
} test;
как мне это описать в .h файле, чтобы другие знали, что есть такой test.flag.leadingzero?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

uldemir писал(а):как мне это описать в .h файле, чтобы другие знали, что есть такой test.flag.leadingzero?
сам всегда делаю и другим советую: typedef

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

// файл my_defines.h
typedef struct {
  unsigned char dst_enable: 1;  // вкл. перехода на летнее время
  unsigned char leadingzero:1;
} flag_t;
  
typedef union {
  unsigned char eflag;
  flag_t   fflag;
} test_t;

extern test_t test;

// в одном из файлов пишется так
#include "my_defines.h"
test_t test;

// в остальных файлах только инклюдится my_defines.h
Добавлено after 6 minutes 10 seconds:
кстати, многие компиляторы, например, GCC, поддерживают безымянные (анонимные) структуры и юнионы внутри структурных типов данных. то есть можно так

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

typedef union{
     unsigned char as_byte;
     struct{
        unsigned char dst_enable: 1;  // вкл. перехода на летнее время
        unsigned char leadingzero:1;
     }
} flag_t;

extern flag_t flag;
тогда можно будет сократить число точек при обращении к полям flag:

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

flag.as_byte = 3;
flag.dst_enable = 0;
flag.leadingzero = 1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="Const14",url="/forum/viewtopic.php?p=3476543#p3476543"]В данном примере кажется логичным представить составной оператор перестановки в виде одного:

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

if( a[i]<b[j] )
    t = a[i], a[i] = b[j], b[j] = t;
[/uquote]
Тогда уж:

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

if(a[i] < b[j])
    b[j] = (t = a[i], a[i] = b[j], t);
<мечтательно>Ещё бы t прямо здесь объявить ...</мечтательно> :D
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477438#p3477438"]<мечтательно>Ещё бы t прямо здесь объявить ...</мечтательно> :D[/uquote]C++17 - мечты сбываются. Теперь переменную можно объявить не только в for, но и в if, и switch.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3477441#p3477441"]C++17 - мечты сбываются. Теперь переменную можно объявить не только в for, но и в if, и switch.[/uquote]
Ну не знаю как ++17 - но переменные в условии if объявляю уже достаточно давно - в Скотт Мейер-овской книжке подсмотрел. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вот прямо так?

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

if(uint32_t x=10; A<B) { ... } else { ... } 
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS, можно пример где реально есть подобная необходимость?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3477668#p3477668"]Вот прямо так?[/uquote]
Не, типа так:

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

if (volatile st_port0* p = guessPort()) {
   p->PMR |= 0x01;
}
Работает как в gcc для renesas, так и в десятилетней свежести MSVS.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3477827#p3477827"]VladislavS, можно пример где реально есть подобная необходимость?[/uquote]А почему ты мне этот вопрос задаёшь? Представляешь себе хоть немного процесс принятия изменений в язык? Я лишь констатировал факт, что мечты сбываются. А если по существу, то ограничение области видимости переменной уменьшает количество ошибок и упрощает работу оптимизирующего компилятора.

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477845#p3477845"]Не, типа так:[/uquote]Это совсем не то и есть воплощение зла в чистом виде. Борьба с ним как раз ещё одно "зачем оно нужно".
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):А если по существу, то ограничение области видимости переменной уменьшает количество ошибок и упрощает работу оптимизирующего компилятора.
Можно ведь написать так и получить тот же результат.

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

{
  uint32_t x=10; 
  if(A<B) { ... } else { ... }
}
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3478099#p3478099"]Можно ведь написать так и получить тот же результат.[/uquote]Было бы странно, если бы почти через 40 лет после создания языка чего-то нельзя было сделать его оператором if, не правда ли? Вы ретроград, батенька! Смиритесь, это теперь стандарт языка. Всё больше и больше вы это будете встречать в чужом коде. Это, кстати, мелкое нововведение, есть куда более интересные и полезные. Предлагаю не опоздать, вскочить на подножку уходящего поезда и пользоваться плодами прогресса.
Ответить

Вернуться в «Разные вопросы по МК»