Зараз я навчаюсь C ++ із книгою C ++ Primer і однією з вправ у книзі є:
Поясніть, що робить наступний вираз:
someValue ? ++x, ++y : --x, --y
Що ми знаємо? Ми знаємо, що потрійний оператор має вищий пріоритет, ніж оператор комами. З бінарними операторами це було досить просто зрозуміти, але з потрійним оператором я борюся трохи. Для двійкових операторів ", що мають більший пріоритет" означає, що ми можемо використовувати дужки навколо виразу з більш високим пріоритетом, і це не змінить виконання.
Для потрійного оператора я би зробив:
(someValue ? ++x, ++y : --x, --y)
ефективно виходить той самий код, який не допомагає мені зрозуміти, як компілятор буде групувати код.
Однак, випробовуючи компілятор C ++, я знаю, що вираз компілюється, і я не знаю, що :
може стояти сам оператор. Отже, компілятор, здається, правильно інтерпретує термінальний оператор.
Потім я виконав програму двома способами:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
Призводить до:
11 10
Хоча з іншого боку на someValue = false
ній друкується:
9 9
Чому компілятор C ++ генерує код, який для істинної гілки потрійного оператора збільшується лише з кроком x
, тоді як для хибної гілки потрійного він зменшує як x
і y
?
Я навіть пішов так, щоб ставити дужки навколо справжньої гілки так:
someValue ? (++x, ++y) : --x, --y;
але це все одно призводить до 11 10
.
?
- умовний оператор . Термін термінальний оператор просто означає оператор з трьома операндами. Умовний оператор є одним із прикладів потрійного оператора, але мова (теоретично) може мати декілька потрійних операторів.