Rumah > pembangunan bahagian belakang > C++ > Mengapakah `stringstream` Mengubah Suai Pembolehubah Sasaran pada Kegagalan Pengekstrakan dalam C 11 dan Kemudian?

Mengapakah `stringstream` Mengubah Suai Pembolehubah Sasaran pada Kegagalan Pengekstrakan dalam C 11 dan Kemudian?

Barbara Streisand
Lepaskan: 2024-11-26 15:46:09
asal
553 orang telah melayarinya

Why Does `stringstream` Modify the Target Variable on Extraction Failure in C  11 and Later?

Mengapa aliran rentetan >> Ubah Nilai Sasaran pada Kegagalan Pengekstrakan Selepas C 11?

"TC PL" Stroustrup menyatakan bahawa nilai pembolehubah sasaran harus kekal tidak berubah jika operasi istream atau ostream gagal. Walau bagaimanapun, ini bercanggah dengan tingkah laku yang diperhatikan dengan aliran rentetan:

#include <iostream>
#include <sstream>

int main() {
  std::stringstream ss;
  int v = 123;
  ss << "The quick brown fox.";
  if (ss >> v) {
    std::cout << "Unexpected success in reading a word into an int!\n";
  }
  std::cout << "After extraction failure: " << v << "\n";
  return 1;
}
Salin selepas log masuk

Kod ini mencetak "Selepas kegagalan pengekstrakan: 0," walaupun terdapat tuntutan Stroustrup.

C 11 Pengubahsuaian Tingkah Laku

Percanggahan ini berpunca daripada perubahan dalam tingkah laku rentetan selepas C 11. Sebelum C 11, stringstream menggunakan kaedah penghuraian gaya scanf, meninggalkan nilai sasaran tidak berubah apabila gagal. Walau bagaimanapun, sejak C 11, ia menggunakan std::strtoll, yang menulis sifar kepada pembolehubah nilai dan menetapkan failbit pada kegagalan pengekstrakan.

Perubahan ini sejajar dengan gelagat C 11 yang disemak bagi operasi istream dan ostream:

  • Apabila gagal, nilai sasaran ditetapkan kepada 0 atau ekstrem yang sesuai nilai.
  • failbit ditetapkan untuk menunjukkan kegagalan.

Kesimpulan

Manakala petikan Stroustrup menerangkan dengan tepat kelakuan operasi istream dan ostream sebelum C 11, tingkah laku pasca-C 11 stringstream menyimpang daripada penerangan ini disebabkan oleh penggunaan mekanisme pengekstrakan yang berbeza. Dalam C 11 dan seterusnya, adalah penting untuk mengetahui tingkah laku yang diubah ini apabila menggunakan operasi aliran rentetan.

Atas ialah kandungan terperinci Mengapakah `stringstream` Mengubah Suai Pembolehubah Sasaran pada Kegagalan Pengekstrakan dalam C 11 dan Kemudian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan