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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Аlex писал(а):У "? :" приоритет ниже чем у "==". По этому, Ваши рассуждения неверны.

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

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
будет восприниматься как

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

(time_format_12_AM_PM == 0) ? point[0] = 0 : point[0] = 1;
Вы правы, полистал документацию - так и есть. Тогда, по идее, должно было бы скомпилироваться.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

FreshMan писал(а):в чем состоит моя ошибка при написании тернарного оператора ?
У операторов ?: и = одинаковый приоритет и правая ассоциативность. Результат операции присваивания - собственно присваиваемое значение. Вероятно случай компилятора-параноика, который хочет результат всей тернарной операции обязательно куда-то присунуть. Для проверки гипотезы попробуйте так:

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

point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Соберётся - параноик, не соберётся - в ассоциативности, стало быть запутался.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Автор, вероятнее всего, сам что-то намудрил и сидит теперь подглядывает за нами, стыдясь ответить сюда :))
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Аlex писал(а):Автор, вероятнее всего, сам что-то намудрил
за неимением опыта такое приходится мудрить что и стыдно потом становится за напрасно написанные строки :))
остановился на этом

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

point[0] = time_format_12_AM_PM; // выкл/вкл точки 0-го разряда для обозначения АМ/РМ
Tell Me The Truth
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

FreshMan писал(а):за неимением опыта такое приходится мудрить что и стыдно потом становится за напрасно написанные строки :))
Нет ничего постыдного в наработке опыта и оттачивании своего стиля кодирования. Наоборот - получайте удовольствие от возможности выразить свой замысел гораздо более компактно чем ещё вчера. А завтра лаконичнее чем сегодня. :)

Повторю просьбу - проверьте, пожалуйста, компилируется ли такой вариант:

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

point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Спасибо.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Я проверил

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

volatile uint8_t x, y, z, res;

// x == 0 ? y = 0 : z = 1;
// res = x == 0 ? y = 0 : z = 1;
   res = x == 0 ? y : z;
первые две закомментированные строки не компилятся, третья скомпилировалась. Выходит присваивать там, при работе с этим компилятором, нельзя.

P.S. вот со скобками проглотило

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

x == 0 ? (y = 0) : (z = 1);
«И всё-таки она вертится!»
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Siarzhuk писал(а): Повторю просьбу - проверьте, пожалуйста, компилируется ли такой вариант:

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

point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Спасибо.
нет, ошибка таже :)
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):ошибка таже
интересно... что же не так? чем выражение a=b отличается от (a=b)?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

тоже интересно, компилятор GCC для AVR версии 4.3.3 тоесть который с WinAVR устанавливается.

P.S. MinGW 4.8.1 ситуация не изменилась
«И всё-таки она вертится!»
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):что же не так?
А как вам понравится вот это: Renesas-овский e2 студень с KPIT-овским компилятором на базе какой-то гоцацы при сборке С-файла:

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

../src/params.c:623:65: error: lvalue required as left operand of assignment
  point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
                                                                 ^
Обратите внимание куда кажет меточка на третьей строке. А теперь меняем расширение на .cpp и всё собирается. Наконец идём и сравниваем таблицы приоритетов для C и C++. :-D
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):А как вам понравится вот это
мне никогда не нравится то, что я не понимаю...

удивительно, но только на последний оператор присваивания компилятор ругается, и взятие этого оператора в скобки решает проблему... не понимаю - почему?! неужели компилятор берет за lvalue все, что левее последнего оператора = ???? :shock:
point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1; - ошибка
point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : (point[0] = 1); - ошибки нет

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):мне никогда не нравится то, что я не понимаю...
ВСЕЦЕЛО СОЛИДАРЕН ! :))
Tell Me The Truth
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):мне никогда не нравится то, что я не понимаю...
В C тернарная операция имеет приоритет выше чем присваивание и компилятор парсит её так:

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;

результат чего не является lvalue - следовательно имеем ошибку при попытке присвоить ему 1.

В C++ приоритет у обоих одинаковый и тернарная исчисляется полностью:

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;

Походу туман рассеялся. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):Походу туман рассеялся
я, наверное, тупой, но я пока в тумане: если приоритет операций равный, то выполняться они должны слева направо, не так ли? т.е. и в этом случае должна быть ошибка...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Не все слева направо. = и ?: как раз справа налево. Там ещё в Notes интересно про ?: написано, что не всякие компиляторы его приоритет одинаково обрабатывают.

Да уж, в таких ситуациях лучше всё же скобками пользоваться. А такие тонкости оставить для собеседований.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я, конечно, прошу прощения, но привык иметь по всем вопросам свое мнение и вот никак не могу удержаться, чтобы в очередной раз его не высказать: какую траву надо было курить, чтобы сделать стандартом такую кучу противоречий?! :shock: язык Си, имхо, типичный пример того, как не надо делать языки программирования! в язык намеренно введено огромное количество способов сделать одно и то же, но всякий раз с разными побочными эффектами, а чтобы эти эффекты как-то устаканить, введено огромное количество разных оговорочек... в итоге никакой логики в ее естественном понимании применить невозможно: только привыкнешь, что какое-то действо делается вот так вот, как обнаруживаешь, что почти такое же категорически нельзя делать аналогично! зачем все это?!
имхо, в очередной раз повторюсь: язык Си - это кафтан, сшитый стальным тросом стандарта из кусочков всевозможных материй - от дерюги до тончайшего шелка. а все потому, что хотелось все и сразу...
WiseLord писал(а): в таких ситуациях лучше всё же скобками пользоваться
я, конечно, и тут с собственным пониманием снова вылезу.. имхо, единственное правило, которое логично помогает справиться с Си, заключается в том, что не надо даже знать про множество вариантов извращений, которые позволяет делать Си из кода, а следует придерживаться минимального набора возможностей (см. бритва Оккама). касательно тернарного оператора это выливается в то, что я говорил ранее: его назначение - возвращать одно из двух значений, поэтому использовать в нем операнды, для которых возврат значения является побочным эффектом, не надо.
а про скобки согласен: в Си их много не бывает.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение Siarzhuk »

ARV писал(а):в язык намеренно введено огромное количество способов сделать одно и то же, но всякий раз с разными побочными эффектами
Проблему вижу в том, что "колёсный пароход родом из середины XIX века" до сих пор используют в промышленных количествах как основное средство транспортировки. И если в физическом мире длительность существования объектов ограничена естественным устареванем, дряхлением и неизбежным распадом на базовые элементы, то в информационной среде "таких факторов не действует" и свойственная человеческому мозгу лень скорее оборудует каждую "пароконную повозку" спутниковой системой навигации чем рискнёт построить на этом месте совершенно новую инфраструктуру, заточенную под безопасность движения и автопилот.
И, как выразился один знакомый, -"участие в большом коллективном опен-сорц проекте с лихвой утоляет желание тратить время на игру в квесты." ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):для которых возврат значения является побочным эффектом
Скорее проблема в его непривычном использовании в контексте тернарной операции. Ведь конструкции типа

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

a = b = c = 3;
совершенно о том-же, но видели мы их несравнимо чаще и в заблуждение ввести они нас не смогут.

Си ведь родом из 70-ых годов прошлого века - а мир вокруг него изменился чуть ли не полностью. Нужно, наверное, представлять то время, когда ресурсы были дороги и использовалась любая возможность их сэкономить за счёт конструкций множественного назначения. Другой вопрос, что дедушке пора на покой - тут я согласен.
ARV писал(а):а про скобки согласен: в Си их много не бывает.
Вы, верно, в душе не поэт. ;) Расписать замысел максимально лаконично - удовольствие сравнимое разве что с внезапно забредшим в голову четверостишием. Но, работая в коллективе, конечно-же нужно беречь чужое время, расставлять скобки и не умничать.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):Вы, верно, в душе не поэт.
что верно, то верно.
Siarzhuk писал(а):Расписать замысел максимально лаконично - удовольствие сравнимое разве что с внезапно забредшим в голову четверостишием
такое ощущение, что программисты Си - все сплошь поэты, но при этом одновременно и поэтические критики, потому как каждый стремится из любви к искусству написать такой лаконичный код, который обязательно будет раскритикован в пух и прах другим поэтом, выдающим альтернативу еще лаконичнее и непонятнее.

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

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

Сообщение Siarzhuk »

ARV писал(а):такое ощущение, что программисты Си - все сплошь поэты, но при этом одновременно и поэтические критики, потому как каждый стремится
Так ведь стремление к доминированию - базовая потребность приматов. И никто с программистиков этой почётной обязанности не снимал. Выделяются чем могут [- если время после кодинга остается].
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Ответить

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