Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
1

Порядок вычисления выражения в msvc c++

05.03.2016, 16:13. Показов 479. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня всем. Понимаю, что компил оффтопик, но всё же. Пусть у нас есть выражение a = foo() + bar();

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

Но мне сказали, что именно в компиле вижлы считается слева направо и нет никакой неопределенности. Так ли это?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2016, 16:13
Ответы с готовыми решениями:

Порядок вычисления выражения
Привет всем! Не пойму как вычисляется выражение : p = (p | e++ >> 2) & (++p >> 1), при р = 3; у...

Порядок вычисления выражения
if (! ( *(va_arg(argument_pointer, FILE**)) = fopen(va_arg(argument_pointer, char*), "r") ) ) ;...

Почему в MSVC++ 2008 компилируется, а в MSVC++ 2010 вылезает много ошибок?
Кстати, перед запуском в 2010 предлагает конвертировать код. Ну а чем эти две студии отличаются,...

Переход от MSVC 2017 к MSVC 2019
Добрый день, До сих пор я использовал MSVC 2017 x64, но планирую перейти на компилятор MSVC 2019...

5
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
05.03.2016, 18:25 2
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Но мне сказали, что именно в компиле вижлы считается слева направо и нет никакой неопределенности. Так ли это?
Нет, разумеется. Ни спецификация языка C++, ни данный компилятор не документирует порядок вычисления выражений в таком случае. Поэтому порядок вычисления не определен и не предсказуем.

Кто-то может быть пытался "проверять" это на практике, перепробовал массу разных вариантов и конфигураций, и пришел к выводу, что в данном компиляторе вычисления всегда делаются слева направо... Но это была не более чем наивная и бессмысленая трата времени. Доказать стабильность порядка вычисления через практические эксперименты невозможно.
1
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
05.03.2016, 18:38  [ТС] 3
TheCalligrapher, я осознаю, что не определено. А контрпример можете подсказать?
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
05.03.2016, 18:43 4
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
А контрпример можете подсказать?
Не, не могу. Нет у меня под руками контрпримера.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
05.03.2016, 20:09 5
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Но мне сказали, что именно в компиле вижлы считается слева направо
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
А контрпример можете подсказать?
Пожалуйста, в данном конкретном варианте посчитал справа налево.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
struct A {};
 
A foo()
{
    std::cout << "foo ";
    return A();
}
A bar()
{
    std::cout << "bar ";
    return A();
}
 
int operator+(A const & a1, A const & a2)
{
    return 42;
}
 
int main()
{
    int v = foo() + bar();
}
Онлайн тест в VC++: http://rextester.com/DAC99552
0
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
05.03.2016, 21:46  [ТС] 6
DrOffset, спасибо большое за интересный пример! А можно ли заставить примерно такой код выполняться не слева направо в вижловском компиляторе?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int foo()
{
    cout << "foo";
    return 42;
}
 
int bar()
{
    cout << "bar";
    return 30;
}
 
int main()
{
    int var = foo() + bar();
    return 0;
}
Может знаете какие-нибудь ещё контрпримеры?
0
05.03.2016, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2016, 21:46
Помогаю со студенческими работами здесь

Порядок вычисления
Приветствую всех. Скажите, определяет ли стандарт Java порядок вычисления аргументов функции или...

Опишите процесс вычисления выражения заданного выражения 3 + 2 * x -0,5 – 4 / x. Обраб отайте ошибку извлечения квадратного корня из отрицательного
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string&gt;...

Порядок вычисления операций
У Страуструпа написано, что int i = 5; v = i++; Может вызвать неправильный результат, так...

порядок вычисления выражений
порядок вычисления выражений x&gt;100\left| \right|x&lt;=10 и y==0


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru