뻘글입니다

2 * 10 == 2 인가요?

2 * 10의 결과는 20 이죠~?


int? na = 2;
var a = na ?? na * 10;

혹시 이것의 연산결과가 2가 나오는 것에 대해 질문하신거라면
na는 null이 아니기 때문에 ?? 연산자에 따라 na가 그대로 반환돼서 2가 출력 되는겁니다~

1개의 좋아요

int? na = 2; 이라면,

var a = na ?? na * 10; 은 a = 2 이고,
var a = na ?? na * 11; 도 a = 2 이고,
var a = na ?? na * 12; 도 a = 2 이고,

var a = na ?? na * 99; 도 a = 2 이란 말씀이신가요?

lifted operator 를 쓸 때, bool 을 반환하는 연산자는 주의해야 합니다.

bool? a = // ...;
bool? b = // ...;

var c = a && b;
var d = a || b;

c, d 의 값이 어떻게 될 것이라는 연산자의 "정책"은 분명히 존재합니다.

그러나, null 과 관련한 정책의 직관성이 사람 마다 다른 편이라, 코드를 적기도, 읽기도 약간 불편할 때가 있습니다.

예를 들어, 위 코드에서 c, d 의 값이 어떻게 되는 게 맞는지 유추해보세요.

이때는, lifted 연산자 보다는, 3 항 연산자를 사용해서, 판정의 원리를 직접 쓰는 게, 가독성 측면에서 좋습니다.

// 하나라도 null 이면 false 로 판정
var c = ( a is null || b is null) ? false 
   : a.Value && b.Value;
//  둘 다 null 인 경우, true로, 하나만 null 인 경우 false로 판정
var c = ( a is null && b is null) ? true 
   : (b is null) ? false 
   : a.Value && b.Value;
1개의 좋아요

null 병합 연산자 참고하시면 이해되실 겁니다.

그리고 * 연산의 우선 순위가 null 병합 연산자보다 우선입니다.
즉, var a = na ?? na * 10;은 var a = (na ?? na) * 10;이 아니고 var a = na ?? (na * 10); 입니다.

1개의 좋아요

글쓴이가 올린 의도

na = 2 일 때, a = na * 10 은 20 이 되는 것인데,

위에 코드 실행 결과2 아닌가요?

우선 ?? 연산자는 아래와 같이 동작한다고 생각하시면 되십니다.

if(na is not null)
    return na;
else // na is null
    return na * 10;

제가 읽은 글쓴이의 의도는 위의 코드와 같이 동작하는 ?? 연산자는 있는데

if(na is null)
    return na;
else // na is not null
    return na * 10;

위의 코드와 같이 ?? 연산자와 반대로 동작하는 ?!!?는 왜 없을까요? 있으면 좋겟네요
라는 의도로 파악됩니다.

1개의 좋아요