Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570

Является ли результат условного оператора lvalue?

20.03.2013, 05:18. Показов 1305. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
начало

Цитата Сообщение от bodrich Посмотреть сообщение
Проблема в том, что из-за специфического кода, оно собирается только на gcc 3.*
как ты определил, что на более новом gcc она не собирается ?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2013, 05:18
Ответы с готовыми решениями:

Придумайте простую программу с использованием условного оператора IF и оператора switch
Пожалуйста, придумайте простую программу с использованием: условного оператора IF и оператора switch . Эти программы должны быть...

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

Программирование с помощью условного оператора и оператора выбора
Нужно решить две задачи. 1. Даны три числа. Определить является ли сумма каких-либо из них положительной. Указание к выполнению:...

17
104 / 94 / 14
Регистрация: 20.06.2010
Сообщений: 966
Записей в блоге: 16
20.03.2013, 13:29
Цитата Сообщение от accept Посмотреть сообщение
как ты определил, что на более новом gcc она не собирается ?
Попытался собрать Там проблема в том, что одна и та же конструкция, одним компилятором рассматривается, как lvalue (gcc 3.*), а другим, как rvalue (gcc 4.*).
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.03.2013, 13:39  [ТС]
Цитата Сообщение от bodrich Посмотреть сообщение
Попытался собрать
и что вывел gcc ?

Цитата Сообщение от bodrich Посмотреть сообщение
что одна и та же конструкция
какая именно ?
0
104 / 94 / 14
Регистрация: 20.06.2010
Сообщений: 966
Записей в блоге: 16
20.03.2013, 14:26
Цитата Сообщение от accept Посмотреть сообщение
и что вывел gcc ?
Code
1
error: lvalue required as left operand of assignment
Цитата Сообщение от accept Посмотреть сообщение
какая именно ?
C
1
2
3
4
#define IS_SET(flag,bit)  ((flag & 0x3FFFFFFF) & (bit))
#define SET_BIT(var,bit)  ((var) |= (bit & 0x3FFFFFFF))
#define REMOVE_BIT(var,bit)  ((var) &= ~(bit & 0x3FFFFFFF))
#define TOGGLE_BIT(var,bit) ((var) = (var) ^ (bit & 0x3FFFFFFF))
Ваше сообщение слишком короткое. Оно должно быть не менее 3 символов.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.03.2013, 15:13  [ТС]
в этих строках всё правильно
видимо, что-то не то подаётся в качестве var

Добавлено через 2 минуты
посмотри, какой номер строки возле сообщения об ошибке и в исходнике её найди
0
104 / 94 / 14
Регистрация: 20.06.2010
Сообщений: 966
Записей в блоге: 16
20.03.2013, 20:25
Code
1
2
3
4
act.informative.c:2976: error: lvalue required as left operand of assignment
act.informative.c:2977: error: lvalue required as left operand of assignment
act.informative.c:2979: error: lvalue required as left operand of assignment
act.informative.c:2980: error: lvalue required as left operand of assignment
Приложил к посту архив с самим приложением.
Вложения
Тип файла: zip circle30bpl18.zip (1.26 Мб, 5 просмотров)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.03.2013, 00:30  [ТС]
да, это баг gcc

C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void)
{
    int x;
    
    (1 < 2 ? x : x) = 1;
    return 0;
}
Code
1
2
3
4
[guest@localhost c]$ .ansi t.c -o t
t.c: В функции «main»:
t.c:8:21: ошибка: lvalue required as left operand of assignment
[guest@localhost c]$
Добавлено через 22 минуты
вообще, там (в стандарте языка), конечно, не сказано, является ли результат условного оператора lvalue
то есть возможно, что это - неопределённое поведение
1
104 / 94 / 14
Регистрация: 20.06.2010
Сообщений: 966
Записей в блоге: 16
21.03.2013, 09:38
Кстати, в g++ такого бага нет.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.03.2013, 13:01
Цитата Сообщение от accept Посмотреть сообщение
да, это баг gcc
почему баг то???
в C++
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
Cи:
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
Если очень хочется можно переписать пример так:
*((1 < 2) ? &x : &x) = 1;
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.03.2013, 17:06  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
почему баг то?
не баг, а, скорее всего, неопределённое поведение, потому что в стандарте не сказано, является ли результат условного оператора значением lvalue или нет, следовательно, компилятор может сделать на своё усмотрение

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Если очень хочется можно переписать пример так
ну, это обход, а нужно напрямую, так как у bodrich весь код испещрён макросами, которые разделены (то есть в одном возвращается элемент массива в виде lvalue, а в другом происходит присваивание переданному lvalue)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.03.2013, 17:56
Цитата Сообщение от accept Посмотреть сообщение
не баг, а, скорее всего, неопределённое поведение, потому что в стандарте не сказано, является ли результат условного оператора значением lvalue или нет,
Сказано. чётко и однозначно. 6.5.15/100 в свежем или оно же 3.3.15/50 в ANSI.
А у гнушников есть такое понятие как "generalized lvalues" (подробности в info gcc) т.е. фактически они перетащили часть поведения тернарного оператора из плюсов в си.
Цитата Сообщение от accept Посмотреть сообщение
ну, это обход,
ну да, я на Ваш пример написал как получить желаемое, а что там у ТС в архиве и не смотрел по ленности.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.03.2013, 20:58  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Сказано. чётко и однозначно. 6.5.15
а, этот я не смотрел (C99)


Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
оно же 3.3.15/50 в ANSI
а там вот нет инфы (C89)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.03.2013, 21:23
Цитата Сообщение от accept Посмотреть сообщение
а там вот нет инфы (C89)
А вот есть.
Во всех виденных мной версиях стандарта языка Си (как в честно купленных так и в жутких pdf) включая драфты написано одно и тоже: "A conditional expression does not yield an lvalue".
2
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.03.2013, 22:24  [ТС]
Code
1
41. A conditional expression does not yield an lvalue.
это я читал 3.3.15 и там сноска 41, а подумал, что это номер страницы

значит, тот парень, который писал программу, не знает, что по стандарту так нельзя делать - возвращать lvalue через условное выражение

Добавлено через 10 минут
это в src/structs.h
C
906
907
908
#define GET_FLAG(value,flag)  ((unsigned long)flag < (unsigned long)INT_ONE   ? value.flags[0] : \
                               (unsigned long)flag < (unsigned long)INT_TWO   ? value.flags[1] : \
                               (unsigned long)flag < (unsigned long)INT_THREE ? value.flags[2] : value.flags[3])
когда там разделял макросы через промежуточную переменную, всё начинало работать нормально, но вскрывались новые места с ошибками, которые тоже нужно разделять
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.03.2013, 22:25
Цитата Сообщение от accept Посмотреть сообщение
это я читал 3.3.15 и там сноска 41, а подумал, что это номер страницы
А где Вы читаете?
У меня (Американский вариант, 2я редакция) там другой номер сноски (50) и шрифт такой, что попутать сноску и отсыл к странице сложно.
Цитата Сообщение от accept Посмотреть сообщение
значит, тот парень, который писал программу, не знает, что по стандарту так нельзя делать - возвращать lvalue через условное выражение
Есть еще вариант, что это один из "замечательных
программистов" которых Вы поминали в соседнем разделе Для них типично завязываться на gnu'сизмы поклав болт на переносимость.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.03.2013, 22:31  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
А где Вы читаете?
У меня (Американский вариант, 2я редакция) там другой номер сноски (50) и шрифт такой, что попутать сноску и отсыл к странице сложно.
wiki.en.external, третья ссылка снизу
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.03.2013, 22:34
Цитата Сообщение от accept Посмотреть сообщение
третья ссылка снизу
Спасибо, видел когда то этот документ. Это не стандарт, но вроде как очень близко.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.03.2013, 22:39  [ТС]
черновик, по-моему, без поправок 95 года
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2013, 22:39
Помогаю со студенческими работами здесь

Сочетания оператора цикла и условного оператора
вывести на экран все числа a от до b , кратные некоторому числу c

сочетания оператора цикла и условного оператора
Известна оценка каждого ученика по физике, посчитать сколько пятерок, количество человек в классе, четверок, трояк, и двоек..

Замена условного оператора
Задано натуральное число . Найти сумму -1^+2^-3^+4^-...+n^.Условный оператор не использовать.^-это квадрат

замена условного оператора
существует программа вначале которой мы делаем выбор: Console.WriteLine(&quot;Введите Hn:1;1.5;5;10&quot;); ...

Значения условного оператора
Почему эта программа не дает результат условного оператора, и что обозначают then begin. program ttt; var j,k:integer; begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru