Форум программистов, компьютерный форум CyberForum.ru

Написать функцию swap - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Почему нельзя подставлять переменные в выражения #if #else? http://www.cyberforum.ru/cpp-beginners/thread1130277.html
Почему код работает, не должен же, потому что выражение стоящее после #if вычисляется на этапе компиляции, переменные подставлять нельзя?? #include <stdio.h> #include <iostream> using namespace std; int a = 9; int main(void){ #if a>99
C++ В массиве все четные элементы заменить максимальным В одномерном массиве все четные элементы заменить максимальным и отсортировать элементы массива по возрастанию. http://www.cyberforum.ru/cpp-beginners/thread1130253.html
C++ Поменять местами минимальный и максимальный элемент в каждом столбце матрицы
Дано матрицу размера 5 x 10. Превратить матрицу, поменяв местами минимальный и максимальный элемент в каждом столбце.
Найти средние арифметические значения элементов каждой строки матрицы C++
Задать матрицу произвольным способом. Найти средние арифметические значения элементов каждой строки.
C++ Найти количество элементов превышающих среднее арифметическое всех элементов массива http://www.cyberforum.ru/cpp-beginners/thread1130247.html
Дано одномерный массив из 15 целых чисел. Найти количество элементов превышающих среднее арифметическое всех элементов массива.
C++ Cколько раз встречаются числа с 4 одинаковыми цифрами Здравствуйте.Мне нужна помощь. Для всех шестизначных натуральных чисел посчитать сколько раз встречаются числа, в записи которых присутсвует 4 одинаковые цифры. Вот что получилось. #include <iostream> #include <math.h> using namespace std; void main (void) подробнее

Показать сообщение отдельно
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.03.2015, 15:43     Написать функцию swap
Цитата Сообщение от castaway Посмотреть сообщение
Кто-нибудь знает почему так происходит?
Любопытный момент, надо будет поизучать. А пока замечу, что с дефолтовой версией оператора присваивания порядок снова будет 1,2,3. Пруф.

Добавлено через 19 часов 53 минуты
Цитата Сообщение от Alex5 Посмотреть сообщение
что-нибудь говорится про порядок вычисления операндов?
Нашел например такую цитату:
There is no concept of left-to-right or right-to-left evaluation in C++, which is not to be confused with left-to-right and right-to-left associativity of operators: the expression f1() + f2() + f3() is parsed as (f1() + f2()) + f3() due to left-to-right associativity of operator+, but the function call to f3 may be evaluated first, last, or between f1() or f2() at run time.
Проводя параллели с оператором присваивания можно утверждать, что выражение:
C++
1
f(1) = f(2) = f(3);
будет интерпретировано парсером так же как
C++
1
f(1) = (f(2) = f(3));
Однако, это никоим образом не задает порядок вызова функций f(). Единственное что гарантируется на основании упомянутого ранее пункта 5.17/1, то что f(2) и f(3) должны быть вызваны до правого присваивания, а f(1) до левого присваивания.
Проверим:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
struct A {
    A(int i) : i(i) {}
    A & operator = ( const A & a )
    { 
        std::cout << "op=(" << i << "," << a.i << ") ";
        i = a.i;
        return *this; 
    }
    int i = 0;
};
 
A & bar( int n ) {
    std::cout << "bar(" << n << ") ";
    return *new A(n);
}
 
int main() {
    bar( 1 ) = bar( 2 ) = bar( 3 );
    std::cout << std::endl;
}
Результат:
Код
bar(3) bar(2) op=(2,3) bar(1) op=(1,3)
Т.о. на вопрос
Цитата Сообщение от castaway Посмотреть сообщение
Кто-нибудь знает почему так происходит?
скорее всего ответ такой: компилятор сам определяет (implementation defined) порядок вычисления аргументов, для которых выполняется правило unsequenced (1.9/13). Возможно, когда оператор присваивания для пользовательского класса тривиальный (например, когда он явно не задан или задан как = default), компилятору проще вычислить сразу все аргументы, чем чередовать их вычисление с присваиванием.

Хотя вот например clang в любом случае вычисляет все операнды до присваивания. Не важно задан пользовательский оператор= или нет.

Подводя итог можно сказать: не стоит полагаться на порядок вычисления аргументов в цепочке присваиваний. Он может быть совсем не очевиден с первого взгляда.
 
Текущее время: 02:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru