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
Barbara Streisandasal
2024-11-26 15:46:09542semak imbas

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;
}

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:
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