Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
32 / 15 / 5
Регистрация: 09.06.2017
Сообщений: 121
Записей в блоге: 2
1

Как это называется?

14.07.2017, 08:20. Просмотров 1270. Ответов 15
Метки нет (Все метки)

С. Прата, листинг 8.1
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// использование встроенной функции
#include <iostream>
inline double square(double x) { return x*x; } // определение встроенной функции
int main()
{
    double a, b, c;
    c = 13.0;
    a = square(5);
    b = square(4.5 + 7.5);
    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
    std::cout << ", c squared = " << square(c++) << std::endl;  
    std::cout << "now c = " << c << std::endl;
    return 0;
}

Если записать так:
C++
1
2
3
std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
    std::cout << ", c squared = " << square(c++) << std::endl;  
    std::cout << "now c = " << c << std::endl;
, то вывод будет
a = 25, b = 144, c = 13
, c squared = 169
now c = 14
А если записать так:
C++
1
2
std::cout << "a = " << a << ", b = " << b << ", c = " << c << ", c squared = " << square(c++) << std::endl;
    std::cout << "now c = " << c << std::endl;
то вывод будет
a = 25, b = 144, c = 14, c squared = 169
now c = 14
Понятно, что это связано с разделением cout на части. А как это называется вообще, с чем его едят?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2017, 08:20
Ответы с готовыми решениями:

Как называется такой метод и что почитать чтобы это реализовать
Скажите как называется такой метод работы и что почитать чтобы реализовать : 1) программа...

В паскале это называется String
Чем больше я изучаю С, тем больше понимаю, что этот язык придумали извращенцы. В общем это... в...

Что это может быть? или как это называется? Меня взломали!
Доброго дня всем, мне по майл.ру.агент отправили сообщением так: Витя Гасай (08.03.2011 23:29)...

Как это реализовать? И как это правильно называется?
Всем привет. Хочу достигнуть такого эффекта как на этом сайте http://www.kocha.com.au/ Суть...

15
Заблокирован
14.07.2017, 08:36 2
Цитата Сообщение от AmbA Посмотреть сообщение
А как это называется вообще
Порядок вычисления.
0
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
14.07.2017, 08:45 3
Или по-другому: правая ассоциативность для выражений, которые вычисляются для cout.
PS Если неправильно сформулировал, подправьте, пожалуйста.
1
Любитель чаепитий
3463 / 1585 / 492
Регистрация: 24.08.2014
Сообщений: 5,486
Записей в блоге: 1
14.07.2017, 09:02 4
порядок вычисления аргументов не определен до с++17.
то есть в вызове: foo(bar(), bar(), bar());
порядок вызова функций bar не определен и может быть любым.
в с++17 с этим более строго, там всё строго слева направо.
http://www.open-std.org/jtc1/s... 0145r3.pdf
4
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,915
14.07.2017, 09:07 5
Цитата Сообщение от YarRainbow Посмотреть сообщение
правая ассоциативность для выражений, которые вычисляются для cout.
Здесь нет никакой правой ассоциативности, порядок вычисления аргументов неопределен.

http://en.cppreference.com/w/c... eval_order
Order of evaluation of the operands of almost all C++ operators (including the order of evaluation of function arguments in a function-call expression and the order of evaluation of the subexpressions within any expression) is unspecified. The compiler can evaluate operands in any order, and may choose another order when the same expression is evaluated again.
Вот, пожалуйста, примеры, когда один и тот же код дает разные результаты:
В GCC: http://rextester.com/MPIHB21100 (c=14)
В Clang: http://rextester.com/ZHD7115 (с=13)
1
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
14.07.2017, 09:08 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
порядок вычисления аргументов не определен до с++17.
Цитата Сообщение от DrOffset Посмотреть сообщение
Здесь нет никакой правой ассоциативности
Спасибо, я уже понял
0
Заблокирован
14.07.2017, 09:39 7
Цитата Сообщение от DrOffset Посмотреть сообщение
Здесь нет никакой правой ассоциативности, порядок вычисления аргументов неопределен.
Што? Как одно мешает другому? Лол.

Ассоциативность у << — слева направо. Это значит, что
cout << a << b << c
вычисляется как
(((cout << a) << b) << c)
(((cout.operator<<(a)).operator<<(b)).operator<<(c))
а не как
(cout << (a << (b << c)))
(cout.operator<<(a.operator<<(b.operator<<(c))))

Порядок вычисления в (((cout.operator<<(a)).operator<<(b)).operator<<(c)) не определён в том смысле, что нельзя сказать, в каком порядке будут вычислены a, b и c (и не только)

(Я использовал member call syntax для operator<<, это так же можно переписать через вызовы free function)


Цитата Сообщение от DrOffset Посмотреть сообщение
The compiler can evaluate operands in any order, and may choose another order when the same expression is evaluated again.
Это никак не мешает иметь ассоциативность.

Добавлено через 3 минуты
Цитата Сообщение от YarRainbow Посмотреть сообщение
Спасибо, я уже понял
Научи меня понимать неверные утверждения.
1
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
14.07.2017, 10:05 8
Цитата Сообщение от daun-autist Посмотреть сообщение
Научи меня понимать неверные утверждения.
Я понял, что порядок не определен. И утверждать "будет правая(левая) ассоциативность" не совсем корректно.) Какая-то будет, но какая - зависит от компилятора. И конкретно в данном случае, получается правая.
Мне кажется, что именно это мне и пытался сказать DrOffset.
0
Заблокирован
14.07.2017, 10:12 9
Цитата Сообщение от YarRainbow Посмотреть сообщение
И утверждать "будет правая(левая) ассоциативность" не совсем корректно.
Ещё раз: ассоциативность от порядка вычисления не зависит.
Цитата Сообщение от YarRainbow Посмотреть сообщение
Какая-то будет, но какая - зависит от компилятора.
Бред.
1
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
14.07.2017, 10:23 10
Цитата Сообщение от daun-autist Посмотреть сообщение
Ещё раз: ассоциативность от порядка вычисления не зависит.
Я это разве сказал? Если я правильно понимаю, как раз-таки порядок вычислений определяется ассоциативностью. Или я неправильно понимаю?
Цитата Сообщение от daun-autist Посмотреть сообщение
Бред.
а в чем тогда разница в этих примерах? Вы меня троллите? Аргументируйте в чем "бред".
Цитата Сообщение от DrOffset Посмотреть сообщение
PS Порядок вычисления выражений не определен - порядок выбирает компилятор.
0
Заблокирован
14.07.2017, 10:31 11
Цитата Сообщение от YarRainbow Посмотреть сообщение
Я это разве сказал?
DrOffset сказал "Здесь нет никакой правой ассоциативности, потому что порядок вычисления аргументов неопределен." (думаю, там имелось в виду "потому что"). Ты сказал "я понял", значит, в общем-то, считаешь, что отсутствие определённого порядка вычислений означает отсутствие определённой ассоциативности.

Цитата Сообщение от YarRainbow Посмотреть сообщение
Аргументируйте в чем "бред".
Ты #7 не читал?

Цитата Сообщение от YarRainbow Посмотреть сообщение
PS Порядок вычисления выражений не определен - порядок выбирает компилятор.
Да. Компилятор выбирает порядок. Но ты написал "какая-то ассоциативность будет, но какая - зависит от компилятора."
Ассоциативность зависит от того, как её определил стандарт. Если компилятор реализовал её по-другому — это сломанный компилятор.
1
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
14.07.2017, 10:39 12
Цитата Сообщение от daun-autist Посмотреть сообщение
считаешь, что отсутствие определённого порядка вычислений означает отсутствие определённой ассоциативности.
Нет, не считаю.
Цитата Сообщение от daun-autist Посмотреть сообщение
Ты #7 не читал?
Цитата Сообщение от daun-autist Посмотреть сообщение
не определён в том смысле, что нельзя сказать, в каком порядке будут вычислены a, b и c (и не только)
Так вот прежде чем высчитывать эти выражения, компилятору разве не нужно установить порядок? И именно самостоятельно определяя ассоциативность для них, он производит вычисления. Так? Я это имел в виду, когда сказал, что компилятор определяет ассоциативность. Я не прав в этом моменте?

Добавлено через 2 минуты
Цитата Сообщение от daun-autist Посмотреть сообщение
Ассоциативность зависит от того, как её определил стандарт.
Я в данном случае подразумеваю, что ассоциативность - просто "инструмент", для определения порядка. И если стандартом не определенно, как иначе определять порядок, кроме как не устанавливая ассоциативность самостоятельно?
0
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,915
14.07.2017, 10:46 13
Цитата Сообщение от daun-autist Посмотреть сообщение
сказал "Здесь нет никакой правой ассоциативности, потому что порядок вычисления аргументов неопределен."
Нет, не так.
YarRainbow сказал про ассоциативность потому, что, он считал, что если поменять местами выражения в
C++
1
", c = " << c << ", c squared = " << square(c++)
вот так:
C++
1
", c squared = " << square(c++)  << ", c = " << c
то порядок изменится. Потому что вычисление, как он предполагал, идет справа налево.
Так что "нет никакой ассоциативности", следует читать как "нет никакой ассоциативности, которая влияет на порядок вычисления", а не в смысле, что ее вообще нет.

За дотошность, конечно, плюс.
1
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
14.07.2017, 10:53 14
Цитата Сообщение от DrOffset Посмотреть сообщение
YarRainbow сказал про ассоциативность потому, что, он считал, что если поменять местами выражения в
C++
1
", c = " << c << ", c squared = " << square(c++)
вот так:
C++
1
", c squared = " << square(c++) *<< ", c = " << c
то порядок изменится.
Спасибо, вот этот пример сейчас многое для меня прояснил хD
Я правда думал, что измениться)

PS Чертова неопределенность..)
0
Эксперт С++
8166 / 3767 / 810
Регистрация: 15.11.2014
Сообщений: 8,563
14.07.2017, 11:00 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Здесь нет никакой правой ассоциативности, порядок вычисления аргументов неопределен.
все операторы выполняются строго слева направо.
здесь UB связанное с точкой следования.


многократное использование и модификация
одной и той же переменной в пределах одной точки следования - UB
0
DrOffset
14.07.2017, 11:05     Как это называется?
  #16

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
все операторы выполняются строго слева направо.
Я чуть выше пояснил, что имел в виду.

0
14.07.2017, 11:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2017, 11:05
Привет! Вот еще темы с ответами:

Как это называется?
Вот есть элемент типа: class=&quot;abc efd jkl&quot; Класс равен и в кавычках несколько слов через пробел,...

Как это называется?
Как называется вот такое описание XML, взято из документации ISPManager, и где про это можно...

Как это называется?
Очень часто видел с CMS такую вещь: image.jpg, bla-bla... как это называется и как это можно...

Как это называется
При написании for если нажать 2 раза tab, то появляется конструктор (фрагмент кода) for....


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.