>백엔드 개발 >C++ >인수 평가 순서가 C의 `std::cout` 출력에 어떤 영향을 미칩니까?

인수 평가 순서가 C의 `std::cout` 출력에 어떤 영향을 미칩니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-01 10:45:111023검색

How Does Argument Evaluation Order Affect `std::cout` Output in C  ?

std::cout 인수의 평가 순서

std::cout에 전달된 인수의 평가 순서는 특히 혼란스러울 수 있습니다. 하나 이상의 인수가 다른 인수의 값을 수정하는 함수 호출인 경우 인수.

코드 예

다음 C 코드 조각을 고려하세요.

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

foo 함수가 호출된 후 test 값이 1이 될 것으로 예상할 수 있으므로 이 출력은 놀랍게 보일 수 있습니다.

설명

std::cout의 인수 평가 순서는 논리 연산자와 같은 몇 가지 특정 경우를 제외하고 C 표준에 의해 지정되지 않습니다. (&&, ||) 및 삼항 연산자(? :).

이 예에서 컴파일러는 선택한 순서대로 인수를 자유롭게 평가할 수 있습니다. 이 경우 foo 함수가 먼저 평가되어 test 값을 1.0으로 수정합니다. 그러나 foo 함수가 호출되기 전에 std::cout 문이 평가되기 때문에 std::cout 문에 저장된 test 값은 여전히 ​​0.0입니다.

해결책

원하는 평가 순서를 보장하려면 코드를 다음과 같이 다시 작성해야 합니다.

std::cout << "Value of test before function call: " << test << std::endl;
foo(test);
std::cout << "Value of test after function call: " << test << std::endl;

이것은 foo 함수 호출 전후에 테스트가 평가되어 예상되는 출력이 생성되는지 확인합니다.

Value of test before function call: 0
Value of test after function call: 1

위 내용은 인수 평가 순서가 C의 `std::cout` 출력에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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