Rumah > pembangunan bahagian belakang > C++ > Mengapakah std::cout Perintah Penilaian Hujah Tidak Dapat Diramalkan dalam C ?

Mengapakah std::cout Perintah Penilaian Hujah Tidak Dapat Diramalkan dalam C ?

Susan Sarandon
Lepaskan: 2024-12-26 15:46:26
asal
426 orang telah melayarinya

Why is std::cout Argument Evaluation Order Unpredictable in C  ?

Menilai Argumen dalam std::cout Susunan Sisipan

Dalam C , susunan penilaian hujah dalam ungkapan menggunakan sisipan std::cout pengendali boleh mengelirukan. Pertimbangkan coretan kod berikut:

#include <iostream>

bool foo(double &m)
{
    m = 1.0;
    return true;
}

int main()
{
    double test = 0.0;
    std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << foo(test) << "\tValue of test : " << test << std::endl;
    return 0;
}
Salin selepas log masuk

Output kod ini mengejutkan:

Value of test is :      1       Return value of function is : 1 Value of test : 0
Salin selepas log masuk

Memahami output ini memerlukan menyelidiki susunan penilaian hujah.

Perintah Penilaian Tidak Ditentukan

Lazimnya, C tidak menyatakan susunan penilaian hujah dalam ungkapan. Ini terpulang kepada pengkompil untuk membuat keputusan. Walau bagaimanapun, terdapat beberapa pengecualian, seperti:

  • Mata jujukan yang diperkenalkan oleh pengendali tertentu, seperti && dan ||
  • Pengendali ternary

Andaian Penilaian Kiri-ke-Kanan

Ia adalah perkara biasa untuk andaikan penilaian kiri-ke-kanan untuk sisipan std::cout, tetapi ini tidak dijamin. Dalam contoh kami, ujian "dibayangi" dalam hujah ketiga dinilai sebelum panggilan ke foo, yang mengubahnya.

Menyelesaikan Kekeliruan

Untuk memastikan yang dimaksudkan tertib penilaian, bahagikan ungkapan kepada pernyataan berasingan:

double test = 0.0;
std::cout << "Value of test is : \t" << test << std::endl;
std::cout << "Return value of function is : " << foo(test) << std::endl;
std::cout << "Value of test : " << test << std::endl;
Salin selepas log masuk

Kod ini dengan betul output:

Value of test is : 0
Return value of function is : 1
Value of test : 1
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah std::cout Perintah Penilaian Hujah Tidak Dapat Diramalkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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