왜 int x {y = 5}가 가능합니까?


10
int main() {
    int y;
    int x{ y = 5 };
    //x is 5
}

y = 5가 계산 가능한 표현이 아니기 때문에 어떻게 이것이 가능합니까?

또한 컴파일러 또는 IDE가 main ()이 int를 반환하지 않는다고 불평하지 않는 이유는 무엇입니까?


8
y = 5 표현은, 그리고 값을 갖는다 5. 왜 그렇지 않다고 생각합니까?
쓸모없는

2
누락에 관해서 returnmain이 질문을 .
호두

3
더 좋은 방법은 두 번째 질문을 제거하는 것입니다. 하나 하나의 질문 당 문제는 스택 오버플로 선호하는 모델입니다.
StoryTeller-Unslander Monica

아마도 y = 5여기서 5를 산출 하는 이유에 대한 질문을 다시 정의해야 할 것입니다. 할당 연산자가 무언가를 반환 할 가능성은 실제로 C / C ++의 기괴한 기능입니다.
user7860670

답변:


11

마지막 질문부터 시작하겠습니다

또한 컴파일러 또는 IDE가 main ()이 int를 반환하지 않는 것에 대해 불평하지 않는 이유는 무엇입니까?

C ++ 표준 (6.6.1 주요 기능)에 따름

5 main의 return 문은 main 함수를 떠나고 (자동 저장 시간이있는 객체를 파괴 함) 반환 값을 인수로하여 std :: exit를 호출하는 효과가 있습니다. main의 compound-statement의 끝에서 제어가 흐르면, 그 결과는 피연산자가 0 인 리턴과 같습니다 (18.3도 참조).

이 질문과 관련하여

y = 5가 계산 가능한 표현이 아니기 때문에 어떻게 이것이 가능합니까?

C ++ 표준 (8.18 대입 및 복합 대입 연산자)에서

1 대입 연산자 (=)와 복합 대입 연산자는 모두 오른쪽에서 왼쪽으로 그룹화됩니다. 모두 왼쪽 피연산자로 수정 가능한 lvalue가 필요하고 왼쪽 피연산자를 참조하는 lvalue를 반환합니다.

이 선언을 Sp

int x{ y = 5 };

두 문장으로 동등하게 나눌 수 있습니다

y = 5;
int x{ y };

또한 C ++에서는 다음과 같이 변수 y에 대한 참조를 만들 수도 있습니다.

int &x{ y = 5 };

여기에 실증 프로그램이 있습니다

#include <iostream>

int main() 
{
    int y;
    int &x{ y = 5 };    

    std::cout << "y = " << y << '\n';

    x = 10;

    std::cout << "y = " << y << '\n';
}

출력은

y = 5
y = 10

이 선언을 할 수 있습니다

int x{ y = 5 };

다시 쓰기

int x = { y = 5 };

그러나이 선언들 (위 선언들과 비슷하게 보임) 사이에 차이점이 있다는 점을 고려하십시오.

auto x{ y = 5 };

auto x = { y = 5 };

첫 번째 선언에서 변수 x의 유형은 int입니다. 두 번째 선언에서 변수 x의 유형은 std::initializer_list<int>입니다.

차이를 더 잘 보이게하려면 객체의 값이 어떻게 출력되는지보십시오.

#include <iostream>

int main() 
{
    int y;
    auto x1 { y = 5 };  

    std::cout << "x1 = " << x1 << '\n';

    auto x2 = { y = 10 };   

    std::cout << "*x2.begin()= " << *x2.begin() << '\n';

    std::cout << "y = " << y << '\n';

    return 0;
}

프로그램 출력은

x1 = 5
*x2.begin()= 10
y = 10

16

y = 5가 계산 가능한 표현이 아니기 때문에 어떻게 이것이 가능합니까?

대입이며 대입 수율 값, 즉 "왼쪽 피연산자의 cv 정규화되지 않은 유형"은 [expr.ass / 3]를 참조하십시오 . 따라서 y = 5결과 y5초기화하는 데 사용되는 x.

두 번째 질문에 대하여, 표시에 cppreference (또는 [basic.start.main / 5] ) :

main 함수의 본문은 return명령문 을 포함 할 필요가 없습니다 . 제어가 return명령문 을 만나지 않고 main의 끝에 도달하면 그 결과는 실행의 효과입니다 return 0;.

따라서 컴파일러 또는 IDE return는 마지막에 누락 된 명령문에 대해 경고하는 main것은 분명하지 않습니다. 틀림없이, 당신이해야한다는 사실은 항상 return비에서 개체 void기능 execptmain 같아요 역사적 이유, 잘 ... 종류이다.


2
표현식 수 결과 값으로 만 기능을 할 수있는 return하나. -pedantic
쓸모없는

나는 이것이 int x {y = 5}; 성명서는 c
bhura

@bhura-문제는 C가 아니라 C ++에 관한 것입니다.
StoryTeller-Unslander Monica

필요하지 않더라도 여전히 main에서 값을 반환하는 것이 좋은 습관으로 간주된다는 것을 언급 할 가치가 있습니까?
Aconcagua

4

operator=()변수에 할당 된 값 인 값을 초래한다. 이 때문에 다음과 같이 과제를 연결할 수 있습니다.

int x, y, z;
x = y = z = 1;

할당 식값을 . 함수에는 반환 값이 있습니다. 표현하지 않습니다.
Pete Becker

3

당신이 한 번 봐 걸릴 경우 cppreference에 대한 설명서를 , 당신은 볼 operator=()반환에게 할당 된 개체에 대한 참조를. 따라서 할당을 할당 된 개체를 반환하는 식으로 사용할 수 있습니다.

그런 다음 중괄호가있는 정상적인 할당 일뿐입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.