Apa yang saya tidak suka di C dan C ++

Tolong jangan membaca untuk programmer C / C ++ profesional).

Dalam artikel saya menyatakan sudut pandang saya, jika Anda tidak setuju, berilah alasan dalam komentar.
Tujuan artikel ini: untuk menunjukkan kelemahan C dan C ++ yang saya benar-benar tidak suka dan mendorong Anda untuk menggunakan versi bahasa yang baru atau bahkan mungkin menawarkan beberapa ide untuk meningkatkan standar.

Nah, ini saatnya menyalakan kembali holivar.

Saya pikir semua orang sadar bahwa di C ++ ada garis yang mengerikan. Terutama jika kita berbicara tentang tipe lama, banyak yang telah diperbaiki dan diperbaiki pada string baru, tetapi masih belum ada dukungan unicode (!).

Dalam standar C ++ 20, itu seperti akan memasukkan string unicode.

C ++ 20! Dan ini terlepas dari kenyataan bahwa C ++ telah ada sejak tahun 1983 .

Buka IDE favorit Anda dan cobalah untuk mengkompilasi kode berikut:

#include <iostream> #include <cstdio> int main() { char string [256]; std::cout << ": "; gets(string); std::cout << ": " << string; return 0; } 

UPD1: komentator mengatakan bahwa krakozyabry hanya di Windows. Itu pasti, lupa menulis tentang itu.
Tapi tetap saja tidak menyenangkan.

Saya dikompilasi di Dev Cpp, kompiler GCC.

Kompilasi dan lihat:



Output layar bagus, ya?

Sekarang mari kita ganti string char [256] dengan char * string.

Saya tidak mengatakan bahwa ini harus berhasil, tetapi kompiler seharusnya telah melemparkan kesalahan setinggi mungkin.

Kami punya program kerja yang macet.
Akan lebih baik jika kompiler melakukan kesalahan.
Dan semuanya adalah bahwa kompiler tidak hanya mengkompilasinya, itu belum
peringatan yang dikeluarkan.

Ini lelucon lain:

 #include <iostream> using namespace std; int main(){ int arr[100]={}; cout<<arr[101]<<endl; return 0; } 

Apa yang kita harapkan Kompiler akan memberi tahu kami bahwa Anda tidak dapat mengakses 101 elemen array, karena hanya ada 100 elemen. Tetapi kami mengkompilasi, menjalankan, dan melihat ... 32765 (setidaknya pada perangkat keras saya).

Hmm.

Sekarang mari kita coba kode ini:

 int i = 5; i = ++i + ++i; std::cout<<i; 

Menurut Anda apa yang akan dia bawa?

Jawaban yang benar tergantung pada kompiler.

Di GCC, ini akan menjadi 14, tetapi tergantung pada bendera optimisasi.

Dan di kompiler lain dapat dengan mudah menjadi 12 ...

Saya pikir semua orang tahu bahwa di C dan di plus ada banyak gula sintaksis, yang jauh dari yang selalu dibutuhkan.

Misalnya std::cout<<4["string"]; ini kode yang valid
Ini mencetak n, seperti std::cout<<"string"[4];

Bagus, ya?

Dan sekarang tentang pasien.
C ++ dan jaringan.
Ini adalah 2 konsep yang sangat tidak cocok.
Coba unduh gambar kucing dari situs favorit Anda menggunakan pustaka C ++ standar.
Ini tidak mungkin dilakukan sebelum penerapan standar C ++ 17.
Anda tidak dapat bekerja dengan JSON di perpustakaan standar yang sama.
Komentar bagus untuk ini.
Secara umum, bekerja dengan JSON di C ++ mirip dengan mimpi buruk.
Sumber
Apakah Anda pikir kondisinya akan selalu salah?

 if(sizeof ('a') != sizeof (char)){ //do something } 

Tidak, Anda salah.

Jika Anda mengkompilasinya sebagai proyek C ++, maka kondisi tersebut kemungkinan besar tidak terpenuhi.
Seharusnya tidak. [1]
Dan jika seperti proyek C, maka dalam hal ini sizeof ('a') == sizeof (int).
Ini adalah beberapa hal.
[1] Secara umum, banyak kompiler C dan C ++ yang berbeda juga merupakan masalah.
Karena banyak solusi tidak terstandarisasi dan mereka hanya akan bekerja pada kompiler tertentu.

Misalnya, angka 128 bit dalam C ++. Ada tipe __int128 di gcc dan dentang, sementara itu tidak di Visual Studio karena itu bukan standar. Atau, misalnya, string dalam Visual Studio.

 String^ MyString3 = "Hello, world!"; //   GCC 

Atau, misalnya, di Borland C ++ Builder, Anda dapat menulis kode dalam Object Pascal.
Dan ada banyak momen seperti itu.

Nyeri tertentu adalah tidak adanya daftar paket C dan C ++.

Apa yang mengikuti dari ini? Gunakan versi baru C ++, misalnya C ++ 17 dan beberapa masalah akan teratasi.

Saya harus mengatakan bahwa di pesaing terdekat C ++ - Rust tidak ada sebagian besar masalah dari daftar ini, misalnya ada kargo yang luar biasa, tetapi tentu saja itu juga tidak ideal.

Dan masalah apa dari C dan C ++ yang Anda tahu?
Tulis di komentar.

UPD: sepertinya banyak orang salah paham artikel saya:
Tidak berarti saya ingin mengkritik C / C ++ dan mengatakan menulis di masa lalu.
Saya hanya menunjukkan kekurangan C / C ++, karena mereka mendapat sedikit dari itu.

Semuanya memiliki kekurangannya, saya hanya berbagi pemikiran.
UPD2:

Dalam komentar, banyak yang menulis bahwa tawon bekerja dengan cara ini dan umumnya ini adalah fiturnya. Kalian salah.
Bukti yang sama berkembang bahwa Anda dapat membuat bahasa pemrograman sistem di mana tidak mudah untuk menembak diri sendiri.

Hanya saja C / C ++ penuh dengan warisan solusi yang tidak akan diperbaiki oleh siapa pun, karena dapat merusak kompatibilitas.

Dan ya, ini pendapat saya, ini subjektif .

Jika Anda tidak setuju - komentar yang lebih baik, daripada minus bodoh, karena pendapat kita semua
secara subyektif.

Source: https://habr.com/ru/post/id432488/


All Articles