2 * 10 == 2 인가요?
2 * 10의 결과는 20 이죠~?
int? na = 2;
var a = na ?? na * 10;
혹시 이것의 연산결과가 2가 나오는 것에 대해 질문하신거라면
na는 null이 아니기 때문에 ??
연산자에 따라 na가 그대로 반환돼서 2가 출력 되는겁니다~
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;
null 병합 연산자 참고하시면 이해되실 겁니다.
그리고 * 연산의 우선 순위가 null 병합 연산자보다 우선입니다.
즉, var a = na ?? na * 10;은 var a = (na ?? na) * 10;이 아니고 var a = na ?? (na * 10); 입니다.
우선 ??
연산자는 아래와 같이 동작한다고 생각하시면 되십니다.
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;
위의 코드와 같이 ??
연산자와 반대로 동작하는 ?!
나 !?
는 왜 없을까요? 있으면 좋겟네요
라는 의도로 파악됩니다.