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
Susan Sarandonasal
2024-12-26 15:46:26349semak imbas

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

Output kod ini mengejutkan:

Value of test is :      1       Return value of function is : 1 Value of test : 0

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;

Kod ini dengan betul output:

Value of test is : 0
Return value of function is : 1
Value of test : 1

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!

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