Seri Tutorial Bahasa C – Bagian 5: Membuat Pernyataan-pernyataan

Bagian artikel ini menunjukkan bagaimana pernyataan-pernyataan dapat mengevaluasi ungkapan-ungkapan untuk menentukan ke mana arah sebuah program C seharusnya diproses.

Menguji Ekspresi-ekspresi

Kata kunci if digunakan untuk melakukan uji kondisional dasar yang mengevaluasi sebuah ekspresi atau ungkapan yang diberikan untuk memberikan keluaran sebuah boolean, berupa nilai benar atau salah. Pernyataan-pernyataan yang berada di dalam kurung kurawal yang diikuti dengan evaluasi hanya akan dieksekusi atau dijalankan saat ungkapan diketahui bernilai benar. Jadi, sintaks sebuah pernyataan uji if dapat dilihat seperti berikut:

if (ungkapan-uji) { pernyataan-yang-dieksekusi-ketika-bernilai-benar }

Kemungkinan terdapat beberapa pernyataan yang dieksekusi ketika pengujiannya bernilai benar namun setiap pernyataan harus diakhiri dengan tanda titik-koma ; (semi-colon).

Terkadang bisa jadi Anda ingin mengevaluasi beberapa ungkapan untuk menentukan apakah sebuah atau beberapa pernyataan seharusnya dijalankan dan itu bisa dicapai dengan dua cara. Operator logika && AND bisa digunakan untuk menjamin bahwa pernyataan-pernyataan hanya akan dijalankan ketika dua ungkapan diketahui keduanya bernilai benar dengan sintaks berikut:

if ( (ungkapan-uji-1) && (ungkapan-uji-2) ) { pernyataan-yang-dijalankan } 

Sebagai alternatif, beberapa pernyataan if dapat “disarangkan”, satu di dalam lainnya, untuk menjamin pernyataan-pernyataan hanya akan dijalankan ketika kedua ungkapan yang dievaluasi diketahui bernilai benar, seperti berikut:

if ( ungkapan-uji-1 )
{
    if ( ungkapan-uji-2 ) { pernyataan-yang-dijalankan }
}

Saat satu atau lebih ungkapan yang dievaluasi oleh sebuah pernyataan uji if diketahui bernilai salah maka pernyataan di dalam tanda kurung kurawal tidak dijalankan dan program diproses ke kode selanjutnya.

Sering pula diinginkan untuk memperluas sebuah pernyataan if yaitu dengan menambahkan sebuah pernyataan else dengan menentukan pernyataan-pernyataan dalam kurung kurawal yang dijalankan ketika ungkapan yang dievaluasi oleh pernyataan if diketahui bernilai salah, dengan sintaks berikut:

if ( ungkapan-uji )
    { pernyataan-yang-dijalankan-ketika-bernilai-benar }
else
    { pernyataan-yang-dijalankan-ketika-bernilai-salah }

Hal tersebut merupakan sebuah teknik pemrograman dasar yang menawarkan dua arah proses dalam program, bergantung pada hasil evaluasi, dan dikenal sebagai “pencabangan kondisional”.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mengeluarkan sebuah penyataan ketika ungkapan uji diketahui bernilai benar.

    int main()
    {
        if ( 10 > 7){ printf( "Ya, 7 bernilai lebih besar daripada 1\n" ) ; }
    }
  3. Selanjutnya, dalam blok fungsi main(), keluarkan sebuah pernyataan ketika dua ungkapan yang diuji keduanya diketahui bernilai benar.

    if ( 10 > 7) 
    {
        if ( 12 > 8 )
        { printf( "10 lebih besar daripada 7 dan 12 lebih besar daripada 8.\n" ) ; }
    }
  4. Sekarang, keluarkan sebuah pernyataan bawaan setelah dua ungkapan uji diketahui keduanya bernilai salah.

    if( 5 > 7 )
    { printf( "Ungkapan pertama bernilai benar.\n" ) ; }
    else if ( 5 > 8 )
    { printf( "Ungkapan kedua bernilai benar.\n" ) ; }
    else
    { printf( "Kedua ungkapan bernilai salah.\n" ) ; }
  5. Pada akhir blok fungsi main() berikan keluaran sebuah nilai bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
  6. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran uji-uji kondisional.

    GAMBAR

Menyabangkan Penyabang (switch)

Penyabangan kondisional yang dilakukan dengan melibatkan beberapa pernyataan if else sering dapat dikerjakan secara efisien dengan sebuah pernyataan penyabang switch ketika ungkapan uji hanya mengevaluasi kondisi tunggal.

Pernyataan switch bekerja dengan cara yang tidak biasa. Ia mengambil sebuah nilai yang diberikan sebagai argumen parameter kemudian mencari kecocokan dengan sejumlah nilai pernyataan case. Kode yang dijalankan ketika sebuah kecocokan ditemukan diikutsertakan dalam setiap pernyataan case.

Sebuah hal yang penting untuk mengakhiri setiap pernyataan case dengan sebuah kata kunci break sehingga pernyataan switch akan keluar atau dihentikan ketika sebuah kecocokan ditemukan tanpa mecari lebih jauh kecocokan selanjutnya — terkecuali itu sengaja dibutuhkan.

Sebagai pilihan, pernyataan pernyataan-pernyataan case dapat diikuti dengan sebuah penyataan akhir tunggal default untuk menentukan kode yang dijalankan ketika tidak ada kecocokan yang ditemukan dalam pernyataan case yang ada. Jadi, sintaks sebuah pernyataan penyabangan secara dapat dilihat seperti berikut:

switch ( nilai-uji )
{
    case nilai-cocok-1 : pernyataan-untuk-dijalankan-ketika-cocok-1 ; break ;
    case nilai-cocok-2 : pernyataan-untuk-dijalankan-ketika-cocok-2 ; break ;
    case nilai-cocok-3 : pernyataan-untuk-dijalankan-ketika-cocok-3 ; break ;
    case default : pernyataan-untuk-dijalankan-ketika-tidak-ada-yang-cocok ; break ;
} 

Berdasarkan standar ANSI C, sebuah pernyataan switch bisa memiliki paling sedikit 257 pernyataan kasus, namun tidak ada dua pernyataan case mencoba untuk mencocokkan nilai yang sama.

Ketika sejumlah nilai-kecocokan masing-masing menjalankan pernyataan yang sama maka hanya pernyataan case akhir untuk pernyataan yang dijalankan perlu diikutsertakan dan pernyataan break untuk keluar dari blok pernyataan switch. Sebagai contoh, untuk memberi keluaran pesan yang sama untuk nilai-nilai cocok 0, 1, dan 2:.

switch ( bilangan )
{
    case 0 :
    case 1 :
    case 2 : printf( "Kurang dari 3\n ) ; break ;
    case 3 : printf( "Tepat bernilai 3\n" ) ; break ;
    default: printf( "Lebih besar daripada 3 atau kurang dari nol\n" ) ;
}

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasi sebuah variabel bilangan bulat dan sebuah variabel karakter.

    int main()
    {
        int vBilangan = 2 ; char vHuruf = 'b' ; 
    }
  3. Selanjutnya, dalam blok fungsi main() masukkan sebuah pernyataan penyabangan yang mencoba untuk mencocokkan nilai bilangan bulat.

    switch ( vBilangan )
    {
        case 1 : printf( "Angka satu.\n" ) ;
        case 2 : printf( "Angka kedua.\n" ) ;
        case 3 : printf( "Angka tiga.\n" ) ;
        default : printf( "Angka tidak dikenali." ) ;
    }
  4. Sekarang masukkan sebuah pernyataan penyabangan yang mencoba untuk mencocokkan nilai karakter.

    switch ( vHuruf )
    {
        case 'a' : case : 'b' : case 'c' :
            printf( "Hurufnya adalah %c\n" , vHuruf ) ; break ;
        default : printf( "Huruf tidak dikenali.\n" ) ;
    }
  5. Pada akhir blok fungsi main() berikan nilai keluaran bilangan bulat nol sesuai yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
  6. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran pernyataan-pernyataan penyabangan.

    GAMBAR

Perulangan (loop) Sebuah Bilangan

Sebuah perulangan merupakan sepotong kode dalam sebuah program yang secara otomatis diulangi. Satu eksekusi lengkap semua pernyataan dalam sebuah perulangan disebut sebagai satu “iterasi”, atau satu “lewatan”. Banyaknya sebuah perulangan dikendalikan oleh uji kondisional yang dibuat di dalam perulangan. Ketika ungkapan yang diuji diketahui bernilai benar maka perulangan akan berlanjut — hinga ungkapan uji diketahui bernilai salah, pada titik perulangan berakhir.

Dalam pemrograman C terdapat tiga tipe struktur perulangan — perulangan for, perulangan while, dan perulangan do while, yang memiliki sintaks sebagai berikut:

for ( penginisialisasi ; ungkapan-uji ; penambah-cacah ) { pernyataan-pernyataan } 

Penginisialisasi digunakan untuk menata sebuah nilai awal bagi sebuah pencacah sebanyak iterasi yang dibuat oleh perulangan. Sebuah variabel bilangan bulat digunakan untuk tujuan tersebut dan umumnya diberi nama “i“.

Pada setiap iterasi perulangan, ungkapan-uji dievaluasi dan iterasi tersebut akan hanya berlanjut bila ungkapan tersebut bernilai benar. Saat ungkapan-uji bernilai salah maka perulangan berhenti seketika tanpa mengeksekusi pernyataan lagi. Melalui setiap iterasi, nilai pencacah bertambah kemudian pernyataan dijalankan.

Perulangan dapat disarangkan, satu di dalam lainnya, untuk mengijinkan eksekusi lengkap semua iterasi perulangan anak pada setiap iterasi perulangan induk.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dua variabel bilangan bulat untuk nantinya digunakan sebagai cacah iterasi perulangan.

    int main()
    {
        int i , j ;
    }
  3. Selanjutnya dalam blok fungsi main(), masukkan sebuah perulangan for untuk mengeluarkan nilai pencacah perulangan pada ketiga iterasi.

    for( i = 1 ; i < 4 ; i++ )
    {
        printf( "Iterasi perulangan induk %d\n" , i ) ;
    }
  4. Pada akhir blok fungsi main() berikan keluaran nilai sebuah bilangan bulat nol seperti yang disyaratkan saat mendeklarasikan fungsi.

    return 0 ;
  5. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran perulangan for.

    GAMBAR

  6. Sekarang, dalam blok perulangan masukkan sebuah perulangan bersarang tepat setelah pernyataan keluaran yang ada untuk mengeluarkan nilai pencacah perulangan pada ketiga iterasi perulangan anak.

    for ( j = 1 ; j < 4 ; j++ )
    {
        printf( "\tIterasi perulangan anak %d\n" , j ) ;
    }
  7. Simpanlah berkas program kemudian kompilasi dan jalankan program sekali lagi untuk melihat kedua perulangan.

    GAMBAR

Perulangan Kondisi Bernilai Benar (while true)

Sebuah perulangan while merupakan sebuah alternatif perulangan for yang telah dijelaskan pada contoh-contoh sebelumnya. Perulangan while juga membutuhkan penginisialisasi, ungkapan-uji, dan sebuah penambah cacah, namun kesemuanya itu tidak dimasukkan ke dalam tanda kurung tunggal seperti pada perulangan for. Alih-alih, penginisialisasi harus diletakkan di sebelum blok perulangan dimulai, dan ungkapan-uji harus diletakkan di dalam tanda kurung setelah kata kunci while, kemudian diikuti dengan tanda kurung kurawal yang berisi penambah cacah dan pernyataan yang hendak dijalankan pada setiap iterasi:

penginisialisasi
while ( ungkapan-uji )
{ pernyataan-yang-hendak-dijalankan ; penambah cacah ; }

Baik perulangan while maupun do while akan memroses iterasi hingga ungkapan-uji diketahui bernilai salah, pada titik ketika perulangan akan keluar atau terhenti. Oleh karena itu, merupakan hal yang esensial bahwa tubuh perulangan mengandung kode, pada suatu titik, yang akan mengubah hasil evaluasi ungkapan-uji — alih-alih sebuah perulangan yang tak berujung tercipta sehingga akan mengunci sistem.

Perbedaan yang signifikan antara sebuah perulangan while dan do while yaitu bahwa sebuah perulangan while tidak akan membuat sebuah iterasi jika ungkapan-uji bernilai salah pada evaluasi pertamanya. Sangat berbeda dengan perulangan do while yang akan selalu akan membuat paling sedikit satu iterasi karena pernyataannya dijalankan sebelum evaluasi dibuat. Saran yang baik mengatakan bahwa sebuah perulangan for sebaiknya digunakan untuk melakukan sejumlah iterasi tertentu, sedangkan sebuah perulangan while paling baik digunakan untuk melakukan iterasi hingga suatu kondisi tertentu terpenuhi.

Perulangan merupakan kawan yang sempurna saat digunakan bersama dengan larik mengingat setiap iterasi dapat membaca atau menulis ke anggota-anggota larik secara berurutan.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah variabel pencacah kemudian deklarasikan dan inisialisasikan sebuah variabel larik yang memiliki tiga anggota.

    int main()
    {
        int i , vLarik[3] = { 10 , 20 , 30 } ;
    }
  3. Selanjutnya dalam blok fungsi main, masukkan sebuah perulangan while yang memberikan keluaran nomor setiap anggota dan nilai yang dikandungnya.

    i = 0 ;
    while ( i < 3 )
    {
        printf( "Sementara: vLarik[%d] = %d\n" , i , vLarik[i] ) ; i++ ;
    }
  4. Sekarang masukkan sebuah perulangan do while yang juga memberikan keluaran nomor setiap anggota larik dan juga nilai yang dikandungnya.

    i = 0 ;
    do
    {
        printf( "\nDo while: vLarik[%d] = %d" , i , vLarik[i] ) ; i++ ;
    }
    while ( i < 3 )
  5. Pada akhir blok fungsi main() berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.

    return 0 ;
  6. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran yang sangat identik dari perulangan-perulangan tersebut.

    GAMBAR

Keluar dari Perulangan

Kata kunci break dapat digunakan untuk menghentikan sebuah perulangan secara prematur saat sebuah kondisi tertentu terpenuhi. Pernyataan break ditempatkan di dalam blok pernyataan perulangan dan didahului oleh sebuah ungkapan uji. Ketika pengujian memberikan nilai benar maka perulangan berhenti seketika dan program lanjut memroses tugas berikutnya. Sebagai contoh, dalam sebuah perulangan bersarang maka setelah proses perulangan anak yang diproses selanjutnya adalah iterasi perulangan induk.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi utama yang mendeklarasikan dua variabel bilangan bulat untuk digunakan nantinya sebagai pencacah iterasi perulangan.

    int main()
    {
        int i , j ;
    }
  3. Selanjutnya, dalam blok fiungsi main() masukkan dua perulangan bersarang untuk memberikan keluaran nilai cacah mereka pada setiap iterasi dari total tiga iterasi.

    for( i = 1 ; i < 4 ; i++ ) 
    {
        for( j = 1 ; j < 4; j++)
        {
            printf( "Menjalankan i=%d j=%d\n" , i , j ) ;
        }
    }
  4. Pada akhir blok fungsi main() berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.

    return 0 ;
  5. Simpanlan berkas program kemudian kompilasi dan jalankan program untuk melihat keluara dari perulangan bersarang.

    GAMBAR

  6. Sekarang masukkan pernyataan break pada posisi paling awal blok perulangan anak untuk menghentikan perulangannya — kemudian simpan, kompilasim dan jalankan program sekali lagi.

    if( i == 2 && j == 1 )
    {
        printf( "Hentikan perulangan saat i=%d dan j=%d\n" , i , j ) ;
        break ;
    }

    GAMBAR

Kata kunci continue dapat digunakan untuk melewatkan iterasi tunggal sebuah perulangan ketika sebuah kondisi tertentu dipenuhi. Pernyataan continue ditempatkan di dalam blok pernyataan perulangan dan didahului oleh sebuah ungkapan uji. Saat pengujian memberikan nilai benar maka iterasi tunggal tersebut dihentikan.

  1. Masukkan pernyataan continue pada awal blok perulangan anak untuk melewatkan iterasi pertamanya — kemudian simpan, kompilasi, dan jalankan program kembali.

    if( i == 1 && j == 1 )
    {
        printf( "Lanjutkan perulangan anak saat i=%d dan j=%d\n" , i , j ) ;
        continue ;
    }

    GAMBAR

Menuju Label-Label

Kata kunci goto ditujukan untuk mengijinkan alur program melompat ke label-label pada titik-titik lain dalam kode program, sama seperti sebuah hyperlink pada sebuah halaman web. Namun, dalam kenyataannya itu dapat menyebabkan terjadinya kesalahan, penggunaannya tidak disukai, dan dianggap sebagai bentuk praktik pemrograman yang buruk.

Lompatan yang dibuat kata kunci goto merupakan sebuah fitur yang hebat yang telah ada dalam program komputer selama beberapa dekade, namun kehebatannya disalahgunakan oleh para pemrogram terdahulu yang menciptakan program-program dengan lompatan-lompatan yang sulit untuk diikuti. Hal tersebut menghasilkan code program yang tidak dapat dibaca sehingga penggunaan goto menjadi sangat tidak populer.

Mungkin, salah satu penggunaan kata kunci goto yang valid adalah untuk menghentikan sebuah perulangan anak dengan melompat ke sebuah label tepat setelah akhir blok perulangan induknya. Hal tersebut membuat kedua perulangan terhenti seketika sehingga tidak ada iterasi lebih lanjut dari keduanya yang dijalankan.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dua variabel bilangan bulat yang nantinya digunakan sebagai pencacah iterasi perulangan.

    int main()
    {
        int i , j ;
    }
  3. Selanjutnya, di dalam blok fungsi main() masukkan dua perulangan bersarang untuk memberikan keluaran nilai-nilai cacah mereka pada setiap iterasi dari tiga iterasi total.

    for ( i = 1 ; i < 4 ; i++ )
    {
        for ( j = 1 ; j < 4 ; j++ )
        {
            printf( "Menjalankan i=%d j=%d\n" , i , j ) ;
        }
    }
  4. Masukkan sebuah pernyataan pada baris pertama perulangan anak untuk melompat ke sebuah label bernama “labelAkhir” pada sebuah nilai cacah tertentu.

    if ( i == 2 && j == 1 ) { go to labelAkhir ;}
  5. Sekarang masukkan label tersebut setelah tutup kurung kurawal perulangan induk.

    } labelAkhir:
  6. Pada akhir blok fungsi main() berikan keluaran sebuah bilangan bulat bernilai nol seperti yang disyaratkan pada saat pendeklarasian fungsi.

    return 0 ;
  7. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat terhentinya perulangan setelah melompat.

    GAMBAR

Salah satu alternatif untuk menghindari penggunaan kata kunci goto adalah dengan memeriksa sebuah variabel boolean yang bernilai benar (1) pada setiap iterasi masing-masing perulangan.

  1. Tambahkan variabel lain ke deklarasi variabel yang aa dan inisialisasi dengan sebuah nilai benar yang bernilai satu.

    int i , j , vTanda = 1 ;
  2. Masukkan sebuah uji kondisional nilai variabel yang baru di awal perulangan induk dan anak tepat sebelum keluaran pernyataan.

    if ( vTanda )
  3. Ubahlah baris pertama perulangan anak untuk menggantikan pernyataan goto dengan menyematkan sebuah nilai salah yang bernilai nol.

    if ( i == 2 && j == 1 ) { vTanda = 0 ; }
  4. Hapuslah label labelAkhir: pada penutup kurung kurawal yang sudah tidak berguna kemudian simpan, kompilasi, dan jalankan program kembali untuk melihat keluaran hasil yang sama seperti sebelumnya.

    GAMBAR

Ringkasan

  • Kata kunci if mengerjakan sebuah uji kondisional dasar untuk mengevaluasi sebuah ungkapan yang diberikan untuk memberikan sebuah keluaran boolean yang bernilai benar atau salah.
  • Kata kunci else digunakan untuk menyediakan pernyataan-pernyataan alternatif yang dijalankan saat sebuah evaluasi pernyataan if bernilai salah.
  • Menawarkan arah-arah alternatif yang diproses dalam sebuah program setelah sebuah evaluasi dikenal sebagai “penyabangan kondisional”.
  • Penyabangan kondisional yang dilakukan oleh beberapa penyataan if else sering bisa dilakukan dengan lebih efisien menggunakan sebuah pernyataan switch.
  • Pada umumnya, pernyataan-pernyataan case di dalam sebuah blok switch harus masing-masingnya diakhiri dengan sebuah pernyataan break.
  • Secara pilihan, sebuah blok switch bisa berisi sebuah pernyataan default yang menentukan pernyataan-pernyataan yang dijalankan ketika ditemukan ketidakcocokan.
  • Kata kunci for diikuti dengan tanda kurung yang berisi sebuah penginisialisasi, ungkapan-uji, dan penambah cacah untuk mengendalikan sebuah perulangan.
  • Kata kunci while diikuti dengan tanda kurung uang berisi sebuah ungkapan uji untuk menentukan apakah sebuah perulangan sebaiknya berlanjut atau tidak.
  • Sebuah blok perulangan while harus didahului dengan sebuah penginisialisasi dan mengandung sebuah penambah cacah di dalam blok pernyataannya.
  • Kata kunci do yang diikuti dengan sebuah blok pernyataan yang kemudian harus ada sebuah pernyataan while dengan akhiran sebuah tanda titik koma (semi-colon).
  • Sebuah perulangan do while harus didahului oleh sebuah penginisialisasi dan mengandung sebuah penambah cacah di dalam blok pernyataannya.
  • Tidak seperti perulangan for dan while, pernyataan-pernyataan dalam perulangan do while akan selalu dijalankan setidaknya sekali.
  • Kata kunci break bisa digunakan untuk menghentikan sebuah perulangan, sedangkan kata kunci continue bisa digunakan untuk melewatkan iterasi tunggal.
  • Perulangan-perulangan bisa bentuknya bersarang dan kata kunci goto bisa digunakan untuk keluar atau melompat ke sebuah label tertentu, walaupun penggunaannya tidak direkomendasikan.

Daftar Pustaka

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.
FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail