Dalam strim C, gelagat pengendalian kegagalan berbeza bergantung pada jenis strim dan versi bahasa. Percanggahan ini ditunjukkan oleh tingkah laku yang tidak dijangka yang diperhatikan apabila membaca perkataan ke dalam pembolehubah integer menggunakan aliran rentetan.
Secara tradisinya, seperti yang dinyatakan dalam TC PL (Edisi Ketiga) Stroustrup, jika operasi input gagal, pembolehubah sasaran harus kekal tidak diubah dalam jenis data tertentu. Walau bagaimanapun, apabila menghadapi ketidakpadanan jenis dalam aliran rentetan, nilai pembolehubah diubah suai, bercanggah dengan petikan yang disebut.
Punca percanggahan ini terletak pada perubahan yang dilaksanakan dalam C 11. Pra-C 11, aliran rentetan menggunakan penghuraian gaya scanf untuk mengekstrak nombor. Dalam C 11, kaedah ini digantikan dengan fungsi panggilan seperti std::strtoll, yang mengubah suai sasaran sekiranya berlaku kegagalan.
Oleh itu, perubahan dalam strategi penghuraian memperkenalkan gelagat kegagalan yang berbeza. Sebelum C 11, sasaran kekal tidak diubah suai, manakala dalam C 11 dan kemudian, sasaran ditetapkan kepada sifar apabila gagal.
Untuk mengesahkan teori ini, rujuk rujukan seperti yang disediakan dalam jawapan. Rujukan ini menerangkan bahawa sebelum C 11, kegagalan dalam pengekstrakan menyebabkan nilai tidak diubah suai dan menetapkan failbit. Walau bagaimanapun, dalam C 11 dan seterusnya, kegagalan menghasilkan nilai sifar untuk sasaran dan failbit ditetapkan.
Selain itu, rujukan menyatakan bahawa operator input bergantung pada faset lokal num_get, yang menggunakan fungsi do_get . Dalam C 11, do_get telah diubah suai untuk menggunakan std::strtoll dan fungsi yang serupa, sekali gus menyebabkan perubahan tingkah laku yang diperhatikan.
Atas ialah kandungan terperinci Mengapakah Pengendalian Kegagalan C Stringstream Berbeza Sebelum dan Selepas C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!