Bagikan melalui


Ekspresi Postfix

Ekspresi postfix terdiri dari ekspresi atau ekspresi utama di mana operator postfix mengikuti ekspresi utama. Operator postfix tercantum dalam tabel berikut.

Operator Postfix

Nama Operator Notasi Operator
Operator subskrip [ ]
Operator panggilan fungsi ( )
Operator konversi jenis eksplisit type-name( )
Operator akses anggota . atau ->
Operator kenaikan postfix ++
Operator penurunan postfix --

Sintaks berikut menjelaskan kemungkinan ekspresi postfix:

primary-expression
postfix-expression[expression]postfix-expression(expression-list)simple-type-name(expression-list)postfix-expression.namepostfix-expression->namepostfix-expression++postfix-expression--cast-keyword < typename > (expression )typeid ( typename )

Ekspresi postfix di atas mungkin ekspresi utama atau ekspresi postfix lainnya. Ekspresi postfix mengelompokkan dari kiri ke kanan, sehingga memungkinkan ekspresi dirangkai bersama-sama sebagai berikut:

func(1)->GetValue()++

Dalam ekspresi di atas, func adalah ekspresi utama, func(1) adalah ekspresi postfix fungsi, func(1)->GetValue adalah ekspresi postfix yang menentukan anggota kelas, func(1)->GetValue() adalah ekspresi postfix fungsi lain, dan seluruh ekspresi adalah ekspresi postfix yang menaikkan nilai pengembalian GetValue. Arti ekspresi secara keseluruhan adalah "panggil func passing 1 sebagai argumen dan dapatkan pointer ke kelas sebagai nilai pengembalian. Kemudian panggil GetValue() pada kelas tersebut, lalu tambahkan nilai yang dikembalikan.

Ekspresi yang tercantum di atas adalah ekspresi penetapan, yang berarti bahwa hasil ekspresi ini harus berupa r-value.

Formulir ekspresi postfix

simple-type-name ( expression-list )

menunjukkan pemanggilan konstruktor. Jika nama jenis sederhana adalah jenis dasar, daftar ekspresi harus berupa ekspresi tunggal, dan ekspresi ini menunjukkan pemeran nilai ekspresi ke jenis dasar. Jenis ekspresi pemeran ini meniru konstruktor. Karena formulir ini memungkinkan jenis dan kelas dasar dibangun menggunakan sintaks yang sama, formulir ini sangat berguna saat menentukan kelas templat.

Kata kunci cast adalah salah satu dari dynamic_cast, static_cast atau reinterpret_cast. Informasi lebih lanjut dapat ditemukan di dynamic_cast, static_cast dan reinterpet_cast.

Operator typeid dianggap sebagai ekspresi postfix. Lihat operator typeid.

Argumen formal dan aktual

Program panggilan meneruskan informasi ke fungsi yang disebut dalam "argumen aktual." Fungsi yang disebut mengakses informasi menggunakan "argumen formal" yang sesuai.

Saat fungsi dipanggil, tugas berikut dilakukan:

  • Semua argumen aktual (yang disediakan oleh pemanggil) dievaluasi. Tidak ada urutan tersirat di mana argumen ini dievaluasi, tetapi semua argumen dievaluasi dan semua efek samping selesai sebelum masuk ke fungsi.

  • Setiap argumen formal diinisialisasi dengan argumen aktual yang sesuai dalam daftar ekspresi. (Argumen formal adalah argumen yang dideklarasikan dalam header fungsi dan digunakan dalam isi fungsi.) Konversi dilakukan seolah-olah dengan inisialisasi — konversi standar dan yang ditentukan pengguna dilakukan dalam mengonversi argumen aktual ke jenis yang benar. Inisialisasi yang dilakukan diilustrasikan secara konseptual oleh kode berikut:

    void Func( int i ); // Function prototype
    ...
    Func( 7 );          // Execute function call
    

    Inisialisasi konseptual sebelum panggilan adalah:

    int Temp_i = 7;
    Func( Temp_i );
    

    Perhatikan bahwa inisialisasi dilakukan seolah-olah menggunakan sintaks tanda sama, bukan sintaks tanda kurung. Salinan i dibuat sebelum meneruskan nilai ke fungsi . (Untuk informasi selengkapnya, lihat Inisialisasi dan Konversi).

    Oleh karena itu, jika prototipe fungsi (deklarasi) memanggil argumen jenis long, dan jika program panggilan menyediakan argumen jenis intaktual , argumen aktual dipromosikan menggunakan konversi jenis standar ke jenis long (lihat Konversi Standar).

    Ini adalah kesalahan untuk menyediakan argumen aktual yang tidak ada konversi standar atau yang ditentukan pengguna ke jenis argumen formal.

    Untuk argumen aktual jenis kelas, argumen formal diinisialisasi dengan memanggil konstruktor kelas. (Lihat Konstruktor untuk lebih lanjut tentang fungsi anggota kelas khusus ini.)

  • Panggilan fungsi dijalankan.

Fragmen program berikut menunjukkan panggilan fungsi:

// expre_Formal_and_Actual_Arguments.cpp
void func( long param1, double param2 );

int main()
{
    long i = 1;
    double j = 2;

    // Call func with actual arguments i and j.
    func( i, j );
}

// Define func with formal parameters param1 and param2.
void func( long param1, double param2 )
{
}

Ketika func dipanggil dari utama, parameter param1 formal diinisialisasi dengan nilai i (i dikonversi ke jenis long yang sesuai dengan jenis yang benar menggunakan konversi standar), dan parameter param2 formal diinisialisasi dengan nilai j (j dikonversi ke jenis double menggunakan konversi standar).

Perlakuan jenis argumen

Argumen formal yang dideklarasikan sebagai const jenis tidak dapat diubah dalam isi fungsi. Fungsi dapat mengubah argumen apa pun yang bukan tipe const. Namun, perubahan bersifat lokal ke fungsi dan tidak memengaruhi nilai argumen aktual kecuali argumen aktual adalah referensi ke objek yang bukan tipe const.

Fungsi berikut mengilustrasikan beberapa konsep ini:

// expre_Treatment_of_Argument_Types.cpp
int func1( const int i, int j, char *c ) {
   i = 7;   // C3892 i is const.
   j = i;   // value of j is lost at return
   *c = 'a' + j;   // changes value of c in calling function
   return i;
}

double& func2( double& d, const char *c ) {
   d = 14.387;   // changes value of d in calling function.
   *c = 'a';   // C3892 c is a pointer to a const object.
    return d;
}

Elipsis dan argumen default

Fungsi dapat dinyatakan menerima lebih sedikit argumen daripada yang ditentukan dalam definisi fungsi, menggunakan salah satu dari dua metode: elipsis (...) atau argumen default.

Elipsis menunjukkan bahwa argumen mungkin diperlukan tetapi angka dan jenis tidak ditentukan dalam deklarasi. Ini biasanya praktik pemrograman C++ yang buruk karena mengalahkan salah satu manfaat C++: keamanan jenis. Konversi yang berbeda diterapkan ke fungsi yang dinyatakan dengan elipsis daripada fungsi tersebut yang jenis argumen formal dan aktualnya diketahui:

  • Jika argumen aktual berjenis float, argumen dipromosikan untuk mengetik double sebelum panggilan fungsi.

  • Setiap signed char atau unsigned char, signed short atau unsigned short, jenis enumerasi, atau bidang bit dikonversi ke signed int atau unsigned int menggunakan promosi integral.

  • Argumen jenis kelas apa pun diteruskan oleh nilai sebagai struktur data; salinan dibuat oleh penyalinan biner alih-alih dengan memanggil konstruktor salinan kelas (jika ada).

Elipsis, jika digunakan, harus dideklarasikan terakhir dalam daftar argumen. Untuk informasi selengkapnya tentang meneruskan jumlah variabel argumen, lihat diskusi va_arg, va_start, dan va_list di Referensi Pustaka Run-Time.

Untuk informasi tentang argumen default dalam pemrograman CLR, lihat Daftar Argumen Variabel (...) (C++/CLI).

Argumen default memungkinkan Anda menentukan nilai yang harus diasumsikan argumen jika tidak ada yang disediakan dalam panggilan fungsi. Fragmen kode berikut menunjukkan cara kerja argumen default. Untuk informasi selengkapnya tentang pembatasan menentukan argumen default, lihat Argumen Default.

// expre_Ellipsis_and_Default_Arguments.cpp
// compile with: /EHsc
#include <iostream>

// Declare the function print that prints a string,
// then a terminator.
void print( const char *string,
            const char *terminator = "\n" );

int main()
{
    print( "hello," );
    print( "world!" );

    print( "good morning", ", " );
    print( "sunshine." );
}

using namespace std;
// Define print.
void print( const char *string, const char *terminator )
{
    if( string != NULL )
        cout << string;

    if( terminator != NULL )
        cout << terminator;
}

Program sebelumnya mendeklarasikan fungsi, print, yang mengambil dua argumen. Namun, argumen kedua, terminator, memiliki nilai default, "\n". Dalam main, dua panggilan pertama untuk print memungkinkan argumen kedua default menyediakan baris baru untuk mengakhiri string yang dicetak. Panggilan ketiga menentukan nilai eksplisit untuk argumen kedua. Output dari program adalah

hello,
world!
good morning, sunshine.

Baca juga

Jenis Ekspresi