Saat ini saya belajar C ++ dengan buku C ++ Primer dan salah satu latihan di buku ini adalah:
Jelaskan apa yang dilakukan ekspresi berikut:
someValue ? ++x, ++y : --x, --y
Apa yang kita ketahui? Kita tahu bahwa operator terner memiliki prioritas yang lebih tinggi daripada operator koma. Dengan operator biner, hal ini cukup mudah untuk dipahami, tetapi dengan operator terner saya sedikit kesulitan. Dengan operator biner "memiliki prioritas lebih tinggi" berarti kita dapat menggunakan tanda kurung di sekitar ekspresi dengan prioritas lebih tinggi dan itu tidak akan mengubah eksekusi.
Untuk operator terner, saya akan melakukan:
(someValue ? ++x, ++y : --x, --y)
secara efektif menghasilkan kode yang sama yang tidak membantu saya dalam memahami bagaimana kompilator akan mengelompokkan kode.
Namun, dari pengujian dengan compiler C ++ saya tahu bahwa ekspresi mengkompilasi dan saya tidak tahu apa yang :
bisa dipegang oleh operator dengan sendirinya. Jadi kompilator tampaknya menafsirkan operator terner dengan benar.
Kemudian saya menjalankan program dengan dua cara:
#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;
}
Hasil dalam:
11 10
Sedangkan di sisi lain dengan someValue = false
itu mencetak:
9 9
Mengapa compiler C ++ menghasilkan kode yang untuk cabang-benar dari operator terner hanya bertambah x
, sedangkan untuk cabang-palsu dari terner itu menurunkan keduanya x
dan y
?
Saya bahkan melangkah lebih jauh dengan menempatkan tanda kurung di sekitar cabang-asli seperti ini:
someValue ? (++x, ++y) : --x, --y;
tapi tetap saja hasilnya 11 10
.
?
adalah operator bersyarat . Istilah operator terner berarti operator dengan tiga operan. Operator bersyarat adalah salah satu contoh operator terner, tetapi suatu bahasa dapat (secara teoritis) memiliki beberapa operator terner.