>백엔드 개발 >C++ >`std::cout`에서 인수 평가 순서가 지정되지 않은 이유는 무엇이며 일관된 출력을 보장하려면 어떻게 해야 합니까?

`std::cout`에서 인수 평가 순서가 지정되지 않은 이유는 무엇이며 일관된 출력을 보장하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-18 20:13:14236검색

Why is the Order of Argument Evaluation in `std::cout` Unspecified, and How Can I Ensure Consistent Output?

std::cout의 인수 평가 순서

C에서는 스트림 삽입 연산자(std::cout)의 인수 평가 순서 지정되지 않았습니다. 이로 인해 여러 인수가 동시에 삽입되면 예기치 않은 동작이 발생할 수 있습니다.

다음 코드를 고려하세요.

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

이 코드의 예상 출력은 다음과 같습니다.

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

그러나 실제 출력은 컴파일러와 플랫폼에 따라 다를 수 있습니다. 코드는 다음을 인쇄할 수 있습니다.

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

이는 std::cout 문의 인수 평가 순서가 정의되지 않았기 때문입니다. 첫 번째 경우 test는 foo() 호출 전에 평가되므로 1이 인쇄됩니다. 두 번째 경우 test는 foo() 호출 후에 평가되므로 0이 인쇄됩니다.

올바른 순서를 보장하려면 , 표현식을 여러 문으로 분할합니다.

double test_after_foo = foo(test);
std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << test_after_foo << "\tValue of test : " << test_after_foo << std::endl;

이렇게 하면 foo(test)가 std::cout 문보다 먼저 평가되어 여러 컴파일러에서 일관된 출력을 제공하고 플랫폼입니다.

위 내용은 `std::cout`에서 인수 평가 순서가 지정되지 않은 이유는 무엇이며 일관된 출력을 보장하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.