Форум — Development Валидное ли это c-выражение? c, c++ 0 4 subj: void foo(char *a, char b, char c) { (a ? *a : b) = c; }GCC съедает без проблем, SDCC ругается что слева не lvalue.upd. Под плюсами корректное, под си нет.upd#2, solution. Ответить Ссылка 😊 1 🤔 2
бессмысленное :-) функция void и даже косвенно через аргумент ничего не отдаёт MKuznetsov ★★★★★ (04.06.26 19:13:06 MSK) Ответить Показать ответ Ссылка 🤦 1
Ответ на: комментарий от MKuznetsov 04.06.26 19:13:06 MSK Косвенно оно возвращает c в *a если там не нулевой указатель.Сделано это чтобы можно было инициализировать int &r = cond ? a : b; в c++, в c соответсвенно такой необходимости нет и выражение невалидно mittorn ★★★★★ (04.06.26 19:30:24 MSK) Последнее исправление: mittorn 04.06.26 19:30:38 MSK (всего исправлений: 1) Ответить Показать ответ Ссылка 👍 1
GCC съедает без проблем gcc -c lor.c -o lor lor.c: In function ‘foo’: lor.c:2:22: error: lvalue required as left operand of assignment 2 | (a ? *a : b) = c; | ^ r--r--r-- (04.06.26 19:59:31 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от mittorn 04.06.26 19:30:24 MSK int &r = cond ? a : b; У тебя тренарный оператор справа от присваивания - никакой связи с ОП-постом. r--r--r-- (04.06.26 20:04:16 MSK) Ответить Показать ответ Ссылка 👎 1
Ответ на: комментарий от r--r--r-- 04.06.26 19:59:31 MSK -x c++ mittorn ★★★★★ (04.06.26 20:12:27 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от r--r--r-- 04.06.26 20:04:16 MSK связь прямая - что взятию ссылки, что присваиванию требуется lvalue mittorn ★★★★★ (04.06.26 20:13:05 MSK) Ответить Ссылка
Ответ на: комментарий от mittorn 04.06.26 20:12:27 MSK Это g++. r--r--r-- (04.06.26 20:13:09 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от r--r--r-- 04.06.26 20:13:09 MSK ну я пояснил, что это поведение c++ и почему оно такое. Для выражения с биндингом ссылки на тернарку её сделали lvalue mittorn ★★★★★ (04.06.26 20:14:45 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от mittorn 04.06.26 20:14:45 MSK Мой поинт - GCC так же считает этот код не валидным си. r--r--r-- (04.06.26 20:17:54 MSK) Ответить Ссылка
Этот фокус нужно делать так: #include <iostream> int main() { int* a = new int; *a = 4; // int* a = nullptr; int b = 5; *(a ? a : &b) = 10; if (a) std::cout << "a=" << *a << std::endl; std::cout << "b=" << b << std::endl; } rumgot ★★★★★ (04.06.26 21:21:52 MSK) Ответить Показать ответы Ссылка ☕☕ 2 👍 2 😊 2 🚮 1
(a ? *a : b) = c; А в чем смысл этого выражения? Ну то есть если a=NULL, то измениться должна локальная копия b? COKPOWEHEU ★ (04.06.26 21:48:06 MSK) Ответить Ссылка ☕☕ 1
Ответ на: комментарий от rumgot 04.06.26 21:21:52 MSK Зачем вы язык меняете? Первоначальный вопрос задавался про Си. Кстати, тип должен быть char. Про int - это отсебятина. VIT ★★ (04.06.26 22:37:30 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от VIT 04.06.26 22:37:30 MSK Тут важен сам механизм присваиваивания. Для C оно будет выглядеть так же. И для char тоже. Ты по сути скажи что-то лучше. А то нашёл тоже, к чему докопаться, смехота. rumgot ★★★★★ (04.06.26 23:18:58 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от rumgot 04.06.26 23:18:58 MSK Это шутка была, никакого подкопа. VIT ★★ (05.06.26 01:09:08 MSK) Ответить Ссылка 😊 1
Ответ на: комментарий от rumgot 04.06.26 21:21:52 MSK нужно std::coutнет mittorn ★★★★★ (07.06.26 01:03:36 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от rumgot 04.06.26 21:21:52 MSK Да откуда вы лезете и что с вами такими делать? BruteForce ★★★★ (07.06.26 02:27:34 MSK) Ответить Показать ответ Ссылка
Ответ на: комментарий от mittorn 07.06.26 01:03:36 MSK Ещё один. Ты в суть смотри, а не в отладочный вывод. rumgot ★★★★★ (07.06.26 07:32:00 MSK) Ответить Ссылка
Ответ на: комментарий от BruteForce 07.06.26 02:27:34 MSK Ты сформулируй вопрос и спроси. rumgot ★★★★★ (07.06.26 07:32:23 MSK) Ответить Ссылка