Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 11.04.2020
Сообщений: 31

Вопрос по С++, чему равно значение выражения

11.04.2020, 22:48. Показов 6815. Ответов 52

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
int a,i,j;
i=3;
j=7;
 
a=i*j+++j+--i;
Какое значение примет j?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2020, 22:48
Ответы с готовыми решениями:

Чему будет равно значение выражения после выполнения операторов?
1. Чему будет равно значение выражения после выполнения операторов C++: 123 & 321? 2. Чему равно значение выражения после выполнения...

чему равно значение выражения '\122'
чему равно значение выражения '\122'?

Чему равно значение логического выражения А and 1 и A and 0?
Чему равно значение логического выражения А and 1 и A and 0? Помогите пожалуйста:kiss:

52
Модератор
Эксперт С++
 Аватар для zss
13789 / 10981 / 6492
Регистрация: 18.12.2011
Сообщений: 29,281
12.04.2020, 11:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
Лучше скобки ставить и не страдать)
Не помогает.
Все равно выводятся шестерки:
C++
1
2
3
4
5
6
    a = 1;
    b = (2 * a) + ++a;
    cout << b << endl;
    a = 1;
    b = ++a + (2 * a);
    cout << b<< endl;
И тут тоже:
C++
1
2
3
4
5
6
    a = 1;
    b = add(++a , 2 * a);
    cout << b << endl;
    a = 1;
    b = add(2 * a, ++a);
    cout << b << endl;
И даже так (выводятся восьмерки):
C++
1
2
3
4
5
6
7
8
9
10
11
12
    a = 1;
    b = add(++a , 2 * a)+a;
    cout << b << endl;
    a = 1;
    b = a+add(2 * a, ++a);
    cout << b << endl;
    a = 1;
    b = add(a , 2 * a) + ++a;
    cout << b << endl;
    a = 1;
    b = ++a + add(2 * a, a);
    cout << b << endl;
1
12.04.2020, 11:23

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Не стану и читать дальше.
Все как и ожидалось...

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.04.2020, 11:28
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какие скобки? При чем здесь скобки?
А вот тут вы правы. Для любых подвыражений работающих со ссылками скобки не помогут. Точка с запятой нужна, то есть разделение на операторы. Верно, не подумал.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Все как и ожидалось
Ожидалось? ...

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
Не помогает.
zss, да, это я хватил)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
12.04.2020, 11:32

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Ожидалось?
В смысле: стандартная тактика. Нанести пурги, загнать себя в угол, выпустить чернильное облако из придирок к словам, после чего устраниться от ответа ("не стану и читать дальше").

Воля ваша. Однако пока не "станете читать" - толку не будет.



Цитата Сообщение от IGPIGP Посмотреть сообщение
А вот тут вы правы
Я? Меня в этом нет вообще. Все вышенаписанное мною - общеизвестные факты из спецификации языка.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.04.2020, 11:34
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я? Меня в этом нет вообще. Все вышенаписанное мною - общеизвестные факты из спецификации языка.
Манера ведения диалога. Вы хотите чтобы я сказал, что вы неправы? Ваша взяла.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
12.04.2020, 11:34
я бы вообще не парился, зачем пользоваться сломанными функциями пусть и хорошего инструмента.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.04.2020, 11:52
Цитата Сообщение от _stanislav Посмотреть сообщение
я бы вообще не парился, зачем пользоваться сломанными функциями пусть и хорошего инструмента.
_stanislav, какие функции сломаны? Ты имеешь ввиду тот факт, что математические выражения содержащие ссылки находятся в рамках синтаксиса будучи не корректыми по смыслу?
0
12.04.2020, 12:40

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
но гарантируется что упорядоченность есть, то есть аргументы вычисляются изолированно
Если не ошибаюсь, то до C++17 этого не гарантировалось.

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
12.04.2020, 12:51
Цитата Сообщение от Croessmah Посмотреть сообщение
Если не ошибаюсь, то до C++17 этого не гарантировалось.
Да, эта гарантия - только начиная с C++17.

Там же добавилась гарантия, что выражение, определяющее саму вызываемую функцию, целиком вычисляется до того, как начнут вычисляться аргументы. С примером

C++
1
2
3
4
5
void f() {
  std::string s = "but I have heard it works even if you don’t believe in it";
  s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don’t"), 6, "");
  assert(s == "I have heard it works only if you believe in it"); // OK
}
До С++17 и это вычисление было "вмешано" в процесс вычисления аргументов и assert в примере не гарантировался.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
12.04.2020, 12:58
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Там же добавилась гарантия, что выражение, определяющее саму вызываемую функцию, целиком вычисляется до того, как начнут вычисляться аргументы.
Я как раз хотел задать вам вопрос по этому поводу.
У нас имеется гарантия
The postfix-expression is sequenced before each expression in the expression-list and any default argument.
Возьмем такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
void foo(int) { std::cout << "foo\n"; }
void bar(int) { std::cout << "bar\n"; }
 
int main()
{
    void (*arr[])(int) = {foo, bar};
    int i = 0;
    arr[i](++i);
}
Если я правильно понимаю, то до C++17 могло быть что угодно, но, начиная с C++17 должна быть всегда исполнена функция foo. Но clang и gcc ругаются на данный код, говоря что операции не упорядочены.
Цитата Сообщение от clang
warning: unsequenced modification and access to 'i'
Цитата Сообщение от gcc
warning: operation on 'i' may be undefined
Собственно, поэтому и возникает вопрос. Что я упускаю (не понимаю)?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
12.04.2020, 13:04
Цитата Сообщение от Croessmah Посмотреть сообщение
Если я правильно понимаю, то до C++17 могло быть что угодно, но, начиная с C++17 должна
быть всегда исполнена функции foo
Да, именно так.

Цитата Сообщение от Croessmah Посмотреть сообщение
Но clang и gcc ругаются на данный код, говоря что операции не упорядочены.
В Clang и GCC реализация новых требований упорядочивания из C++17 еще далека от завершения. Я как-то наткнулся на такой пример

C++
1
2
3
4
5
6
7
8
9
10
uint16_t foo(uint16_t abgr)
{
  return (abgr ^= (abgr >> 8)) ^= (abgr << 8);
}
 
int main() 
{
    uint16_t tmp = 0xAABB;
    printf("%x %x\n", tmp, foo(tmp));
}
Clang дает правильный результат 1111, а GCC - неправильный bb11. При этом оба предупреждают именно так, как вы процитировали. То есть правильный результат Clang - тоже скорее всего случайность.
1
12.04.2020, 13:07

Не по теме:

Значит в этот раз проблема всё-таки в стуле и мониторе. Спасибо.

0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
12.04.2020, 23:50
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в случае add(a++, 2*a) неопределенного поведения нет (!).
Просто интересно почему нет? Если смотреть здесь, то в соответствие с:
If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined
получается, что побочный эффект постинкремента первого аргумента неупорядочен по отношению к вычислению значения второго, что названо неопределенным поведением.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
13.04.2020, 01:36
Цитата Сообщение от fao Посмотреть сообщение
If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined
Это же относится к неупорядоченным операциям. Начиная с C++17 вычисления аргументов функции неопределенно упорядочены (indeterminately sequenced), о чем говорится здесь: https://eel.is/c++draft/expr.call#8
indeterminately sequenced - это не unsequenced.

При неопределенном упорядочении выражения вычисляются в неопределенном порядке, но эти выражения упорядочены между собой - эффекты друг на друга не накладываются.
https://eel.is/c++draft/intro.execution#8
Evaluations A and B are indeterminately sequenced when either A is sequenced before B or B is sequenced before A, but it is unspecified which. [ Note: Indeterminately sequenced evaluations cannot overlap, but either could be executed first. — end note]
Т.е. аргументы функции вычисляются в неопределенном порядке, но их вычисление упорядочено между собой.
0
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
13.04.2020, 01:45
zss, Вы могли бы закрыть тред? Есть ощущение, что это троллинг старым добрым вопросом про ++i + i++
http://lurkmore.to/I%2B%2B
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
13.04.2020, 01:53
Цитата Сообщение от Croessmah Посмотреть сообщение
Начиная с C++17 вычисления аргументов функции неопределенно упорядочены
Ну если речь в ответе #17 шла о стандарте C++17, то все понятно. А так как там это не уточнялось, появились соответствующие вопросы.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
13.04.2020, 01:58

Не по теме:

DobroAlex, а где троллинг-то?



Добавлено через 2 минуты
Цитата Сообщение от fao Посмотреть сообщение
Ну если речь в ответе #17 шла о стандарте C++17, то все понятно. А так как там это не уточнялось, появились соответствующие вопросы.
C++17 пока что является последним стандартом, так что логично разговаривать именно о нем. Но, чтобы не было разногласий имеется пост #29.
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
13.04.2020, 01:58
Цитата Сообщение от DobroAlex Посмотреть сообщение
Есть ощущение, что это троллинг старым добрым вопросом про ++i + i++
Какой троллинг? Тема интересная.
0
13.04.2020, 02:33

Не по теме:

Цитата Сообщение от fao Посмотреть сообщение
Ну если речь в ответе #17 шла о стандарте C++17, то все понятно. А так как там это не уточнялось, появились соответствующие вопросы.
Если "не уточняется", то речь всегда идет об актуальном положении дел в языке, т.е. о самом последнем стандарте.

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.04.2020, 10:24
Цитата Сообщение от fao Посмотреть сообщение
Просто интересно почему нет? Если смотреть здесь, то в соответствие с:
fao, как его может не быть. Тут и без последних выдержек черновика ясно, что если порядок вычисления аргументов неопределён то при вычислении справа налево произведение будет на дважды a больше (единица-то прибавится). И это ни как не зависит от того пост или преф-инкримент использован слева. Это потому, что выражения аргументов не рассматриваются как единое. Но и в едином нет определённости. Рекурсивно неопределённый порядок. Причина (имхо) одна. Код не читает переменные из памяти между шагами вычисления. Он работает с ними как с l-value (наподобие). Тут наверно даже volatile объявленная a не поможет)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2020, 10:24

Чему равно значение логического выражения
Чему равно значение логического выражения x--&lt;3, если до выполнения операции х был равен 3?

Чему будет равно значение логического выражения
чему будет равно значение логического выражения (1&gt;2)||(3&gt;5) и что это значит?

Чему равно значение выражения , chr (25)> = chr (16)
Уважаемые форумчане , задача на паскале . Понимаю что для кого то это семечки , но я новичок ) заранее большое спасибо . Всем удачи и...

Чему равно значение (do '0) ?
Помогите выполнить задание на языке ЛИСП! Даны определения функций (defun twice (f) (function (lambda (x) (funcall f...

Чему равно значение переменной?
Рассчитайте, чему равно значение переменной К после работы фрагмента программы:k:=100;a:=10;b:=-5; if (k mod a=0) or ((a&lt;b) and (a div...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru