C가 그렇다면 Java가 정확히 if (5) {…}와 같은 숫자 조건을 허용하지 않는 이유는 무엇입니까?


33

이 두 가지 작은 프로그램이 있습니다.

기음

#include <stdio.h>
int main()
{
    if (5) {
        printf("true\n");
    }
    else {
        printf("false\n");
    }

    return 0;
}

자바

class type_system {
   public static void main(String args[]) {
       if (5) {
           System.out.println("true");
       }
       else {
           System.out.println("false");
       }
   }
}

오류 메시지를보고합니다.

type_system.java:4: error: incompatible types: int cannot be converted to boolean
       if (5) {
           ^
1 error

내 이해

지금까지이 예를 다른 유형 시스템의 데모로 이해했습니다. C는 더 약한 유형이며 오류없이 int에서 boolean으로 변환 할 수 있습니다. 내재 된 대화가 허용되지 않으므로 Java가 더 강력하게 입력되고 실패합니다.

그러므로 내 질문 : 내가 어디에서 오해를 했습니까?

내가 찾고 있지 않은 것

내 질문은 나쁜 코딩 스타일과 관련이 없습니다. 나는 그것이 나쁘다는 것을 알고 있지만 C가 왜 그것을 허용하고 Java를 허용하지 않는지에 관심이 있습니다. 따라서 언어의 유형 시스템, 특히 언어 유형에 관심이 있습니다.


22
@toogley : Java의 유형 시스템에 대해 구체적으로 알고 싶은 것은 무엇입니까? 언어 사양에 따라 형식 시스템에서 허용하지 않으므로 형식 시스템에서이를 허용하지 않습니다 . C가 허용하고 Java가 허용하는 이유는 두 언어에서 모두 허용되는 것으로 간주되지 않습니다. 타입 시스템의 결과 동작은 효과 그 아닌 원인.
Robert Harvey

8
@toogley : 왜 당신이 무언가를 잘못 이해했다고 생각합니까? 텍스트를 다시 읽으면 질문이 무엇인지 이해할 수 없습니다.
Doc Brown

26
실제로 이것은 C에서 약한 타이핑의 예가 아닙니다 . 과거 (C89)에는 C에 부울 유형이 없었으므로 모든 "부울"연산이 실제로 int값 에 대해 작동했습니다 . 더 적절한 예는 다음과 같습니다 if (pointer).
Rufflewind

5
나는 이것을 이해하려고 많은 연구를하지 않은 것처럼 보이기 때문에 하향 투표했다.
jpmc26

11
원래 질문이 편집 된 버전과 약간 다른 것 같습니다 (따라서 일부 의견과 답변이 다른 질문에 대답하는 것처럼 보입니다). 현재의 형태로는 여기에 의문의 여지가없는 것 같습니다. 무슨 오해? Java는 생각한대로 정확하게 작동합니다.
jamesdlin

답변:


134

1. C와 Java는 다른 언어입니다

그들이 다르게 행동한다는 사실은 놀랍지 않아야합니다.

2. C는에서 모든 변환을 수행하지 않습니다 intbool

어떻게 할 수 있습니까? C는 1999까지bool 변환 할 실제 유형 조차 없었습니다 . C는 1970 년대 초반에 만들어졌으며, 심지어 B 1에 대한 일련의 수정일 때 C가되기 전의 일부였습니다 .if

ifNOP거의 30 년 동안 단순히 C에서 아니었다 . 숫자 값에 직접 작용했습니다. C 에 s를 도입 한 후 10 년이 지난 후에도 C 표준의 언어 ( PDF 링크 ) 는 "0과 같지 않음"및 "0과 같음"이라는 용어를 사용하여 (p 148) 및 (p 100) bool의 동작을 지정합니다. 부울 용어 "true"또는 "false"또는 이와 유사한 것이 아니라 "if?:

편리하게 ...

3. ... 숫자는 프로세서의 명령이 작동하는 것입니다.

JZJNZ조건 분기에 대한 기본 86 조립 지침입니다. 약어는 "아르 J의 UMP 경우 Z의 ERO"및 " J의 UMP 경우 N OT Z의 ERO". 플라즈마 디스플레이 패널-11, C가 유래의 등가물이다 BEQ( " B의 경우 렌치 EQ 연간") 및 BNE( " B의 렌치 경우 N OT E QUAL").

이 명령어는 이전 작업의 결과가 0인지 여부를 확인하고 그에 따라 점프합니다.

4. Java는 C보다 안전에 중점을두고 있습니다. 2

그리고 안전을 염두에두고, s로 제한 if하는 boolean것이 비용의 가치가 있다고 결정했습니다 (이러한 제한 및 결과적인 기회 비용의 구현).


1. B에는 전혀 유형이 없습니다. 어셈블리 언어도 일반적으로 그렇지 않습니다. 그러나 B와 어셈블리 언어는 분기를 잘 처리합니다.

2. C가 된 B에 대한 계획된 수정 사항을 설명 할 때 Dennis Ritchie 의 말에 따르면 (강조 광산) :

... 문자 및 바이트 주소 지정에 대처하고 다가오는 부동 소수점 하드웨어를 준비하기 위해 타이핑 체계가 필요한 것처럼 보였습니다. 다른 유형 , 특히 유형 안전 및 인터페이스 검사 는 이후에 중요해 보이지 않았습니다 .


13
C의 부울 표현식에 대한 좋은 점은 프로세서 명령어에 직접 매핑됩니다. 나는 전에 그것에 대해 생각하지 않았다.
Robert Harvey

17
나는 C가 안전에 중점을 둔 것으로 보인다는 점에서 포인트 4가 잘못되었다고 생각합니다. C는 기본적으로 원하는 모든 것을 수행 할 것입니다 .C는 당신이하는 일을 알고 있다고 가정합니다.
TemporalWolf

13
@TemporalWolf 당신이 C가 당신이 원하는 것을하도록하는 것이 나쁜 것처럼 말입니다. 내 의견의 차이는 C가 프로그래머를 위해 작성되었으며 기본 역량이 예상된다는 것입니다. Java는 코드 원숭이를 위해 작성되었으며 입력 할 수 있으면 프로그래밍 할 수 있습니다. 종종 훌륭하게 나쁘지만 누가 옳은 일을합니까? 입문 자바 클래스 i의 선생님이 CS 부전공의 일부로 강의를 받았을 때를 잊지 못할 것입니다. 피본 나치 수를 계산하기 위해 재귀를 사용하면 "쓰기가 쉬웠 기 때문에"유용 할 수 있다고 지적했습니다. 이것이 바로 우리가 보유한 소프트웨어를 보유한 이유입니다.
DRF

25
@DRF C 네트워킹 클래스의 교수 중 한 명은 "C는 모든 핀을 뽑아 낸 수류탄 상자와 같습니다."라고 말했습니다. 당신은 많은 힘을 가지고 있지만 본질적으로 당신의 얼굴에 날아가는 것이 보장됩니다. 대부분의 경우 번거롭지 않으며 고급 언어를 사용하면 생산성이 훨씬 높아집니다. 파이썬을 해키 C 비트 트위들 링으로 트랜스 코딩하여 속도가 6 배나 증가 했습니까? 예, 그래요 그러나 그것은 예외가 아니라 규칙입니다. 파이썬에서 하루 만에 C에서 2 주가 걸리는 것을 성취 할 수 있습니다 ... 그리고 나는 괜찮은 C 프로그래머입니다.
TemporalWolf

11
@DRF 유명 회사가 개발 한 주류 소프트웨어의 버퍼 오버플로 악용 사례를 감안할 때 기본 역량을 갖춘 프로그래머조차도 발을 not 지 않을 것이라고 믿을 수는 없습니다.
Monica Monica 복원

14

C 2011 온라인 초안

6.8.4.1 if명령문

제약 사항

1 명령문 의 제어식 if은 스칼라 타입이어야한다.

시맨틱 스

2 두 형식에서,식이 0과 같지 않은 경우 첫 번째 하위 명령문이 실행됩니다. else형식에서,식이 0과 같으면 두 번째 하위 명령문이 실행됩니다. 레이블을 통해 첫 번째 하위 명령문에 도달하면 두 번째 하위 명령문은 다음과 같습니다. 실행되지 않았습니다.

3 An else은 구문에서 허용되는 어휘 적으로 가장 가까운 선행과 연관됩니다.

이 절은 제어 표현식 이 부울 유형이 아닌 스칼라 유형 ( char/ short/ int/ long/ etc.)을 갖도록 지정합니다. 제어식에 0이 아닌 값이 있으면 분기가 실행됩니다.

그것과 비교

Java SE 8 언어 사양

14.9 if선언 문은 명령문의 조건부 실행 또는 두 문장의 조건 선택, 실행 하나 또는 다른 있지만 둘 수 있습니다.

if
    IfThenStatement :
        if ( Expression ) 

    IfThenElseStatement :
        if ( Expression ) StatementNoShortIf else 

    IfThenElseStatementNoShortIf :
        if ( Expression ) StatementNoShortIf else StatementNoShortIf
유형이 있어야 boolean하거나 Boolean, 또는 컴파일 타임 오류가 발생합니다.

Java, OTOH는 특히if 명령문 의 제어 표현식에 부울 유형이 있어야합니다.

따라서 약한 타이핑과 강한 타이핑에 관한 것이 아니라 각각의 언어 정의가 유효한 제어 표현식으로 지정하는 것에 관한 것입니다.

편집하다

에 관해서는 언어이 특정 존중, 몇 가지 점에서 다르다 :

  1. C는 "유형이없는"언어 인 B에서 파생되었습니다. 기본적으로 모든 것은 32-36 비트 단어 (하드웨어에 따라 다름)였으며 모든 산술 연산은 정수 연산이었습니다. C의 타입 시스템은 한 번에 조금씩 볼트로 고정되었습니다.

  2. C는 1999 버전의 언어까지 고유 한 부울 유형을 갖지 않았습니다. C 간단히 나타 내기 위해 제로 사용하는 B 규칙 뒤에 false비 제로를 나타내는데 true.

  3. Java는 C를 수십 년 전으로 거슬러 올라가며 C와 C ++의 단점을 해결하기 위해 특별히 고안되었습니다. if성명서 에서 통제 표현에 대한 제한을 강화하는 것은 의심의 여지가 없습니다 .

  4. 예상 할 이유가 없습니다 어떤 두 가지 프로그래밍 언어는 사물을 같은 방법으로 할이. C 및 C ++와 밀접한 관련이있는 언어조차도 흥미로운 방식으로 분기되어 합법적 C ++ 프로그램이 아닌 합법적 C 프로그램을 가질 수 있거나 합법적 C ++ 프로그램이지만 의미가 다른 합법적 인 C 프로그램을 가질 수 있습니다.


너무 슬프다. 나는 두 가지 답변을 "허용"으로 표시 할 수 없다 ..
toogley

1
그렇습니다. 이것은 좋은 질문입니다. 그러나이 질문은 두 언어 사이에 이러한 차이 가 있는지 물었습니다 . 이 문제를 전혀 해결하지 못했습니다.
Dawood는 모니카가

@DawoodibnKareem : 문제는 C가 Java int를 변환 boolean하지 못했지만 Java는 변환을 허용 하지 않는 이유였습니다 . 대답은 C에서 그러한 변환이 없다는 것입니다. 언어는 언어가 다르기 때문에 다릅니다.
John Bode

예, "약한 타이핑 대 강한 타이핑에 관한 것이 아닙니다". 자동 권투와 자동 Unboxing을보십시오. C에 해당 변수가 있으면 스칼라 형식도 허용 할 수 없습니다.
중복 제거기

5

많은 답변이 조건식 내에 포함 된 대입 식을 대상으로하는 것 같습니다. (이것은 알려진 종류의 잠재적 함정이지만,이 경우 Java 오류 메시지의 소스가 아닙니다.)

이것은 OP가 실제 오류 메시지를 게시하지 않았기 때문에 ^캐럿 =이 할당 연산자를 직접 가리 키기 때문일 수 있습니다.

그러나 컴파일러는 =조건부에서 보는 표현식의 최종 값 (및 최종 유형)을 생성하는 연산자이기 때문에 컴파일러를 가리키고 있습니다.

부울이 아닌 값을 테스트하는 데 다음과 같은 오류가 있습니다.

오류 : 호환되지 않는 유형 : int를 부울로 변환 할 수 없습니다

때로는 편리하지만 정수 테스트는 Java 디자이너가 피하려고하는 잠재적 인 함정으로 간주됩니다. 결국 Java에는 true 부울 데이터 유형 이 있으며 C에는 없습니다 (부울 유형이 없음) .

이것은 또한 null / non-null via if (p) ...및에 대한 C의 테스트 포인터에도 적용되며 if (!p) ...Java는 마찬가지로 필요한 부울을 얻는 데 명시적인 비교 연산자가 필요하지 않습니다.


1
C 에는 부울 유형이 있습니다. 그러나 그것은 그 if진술 보다 더 새로운 것 입니다.
MSalters

3
@MSalters C의 bool은 여전히 ​​정수 아래 정수이므로 수행 할 수 있습니다 bool b = ...; int v = 5 + b;. 이것은 산술에 사용할 수없는 전체 부울 유형의 언어와 다릅니다.
Jules

C의 부울은 정말 작은 정수입니다. "true"및 "false"는 매크로 또는 기타로 쉽게 정의 할 수 있습니다.
Oskar Skog

4
@ 줄스 : 당신은 C가 타입 안전성이 약하다는 것을 지적하고 있습니다. 부울 형해서 변환 정수 값을 의미하지 않는다 그것을 이다 정수 유형입니다. 논리에 따르면 정수 유형은 int v = 5; float f = 2.0 + v;C에서 유효 하므로 부동 소수점 유형 이됩니다.
MSalters

1
@MSalters는 실제로 표준에 의해 정의 된 표준 부호없는 정수 유형_Bool 중 하나입니다 ( 6.1.6 / 6 참조).
Ruslan

2

호환되지 않는 유형 : int는 부울로 변환 할 수 없습니다

C가 왜 그것을 허용하고 Java를 허용하지 않는지에 관심이 있습니다. 따라서 언어의 유형 시스템, 특히 언어 유형에 관심이 있습니다.

질문에는 두 부분이 있습니다.

왜 자바 변환하지 않습니다 intboolean?

이것은 가능한 한 명시 적으로 의도 된 Java로 요약됩니다. 타입 시스템으로 "얼굴에"매우 정적입니다. 다른 언어로 자동으로 타입 캐스트되는 것은 Java에서는 그렇지 않습니다. 당신도 작성 int a=(int)0.5해야합니다. 로 변환 float하면 int정보가 손실됩니다. 로 변환 int하는 것과 동일 boolean하므로 오류가 발생하기 쉽습니다. 또한 많은 조합을 지정해야했습니다. 물론, 이러한 것들은 명백해 보이지만주의를 기울이려는 의도가있었습니다.

아, 다른 언어와 비교할 때 바이트 코드는 내부 구현 세부 사항이 아니기 때문에 Java는 사양 이 매우 정확했습니다. 그들은 모든 상호 작용을 정확하게 지정해야 할 것입니다. 거대한 사업.

if다른 유형을 허용 하지 boolean않습니까?

if이외의 다른 유형을 허용하는 것으로 완벽하게 정의 할 수 있습니다 boolean. 다음과 같다는 정의가있을 수 있습니다.

  • true
  • int != 0
  • String.length>0
  • 값 이 아닌 null( 가 아닌) 다른 객체 참조 .Booleanfalse
  • 또는 심지어 : 비 객체 null이며 Object.check_if(이 경우 나 만 발명 한) 메소드 가 반환 하는 다른 객체 참조 true.

그들은하지 않았다; 실제로 필요하지 않았으며 가능한 강력하고 정적이며 투명하고 읽기 쉬운 등을 원했습니다. 암시 적 기능이 없습니다. 또한 구현은 매우 복잡 할 것입니다. 가능한 모든 경우에 대해 각 값을 테스트해야하므로 성능은 작은 요소를 연주했을 수도 있습니다 (Java는 그 당시 컴퓨터에서 sloooow였습니다. 적어도 첫 번째 릴리스의 JIT 컴파일러는 없었습니다. 적어도 그때 사용한 컴퓨터에는 없었습니다).

더 깊은 이유

더 깊은 이유는 Java가 기본 유형을 가지고 있기 때문에 유형 시스템이 객체와 기본 유형 사이에서 찢어진다는 사실 일 수 있습니다. 아마도 그들이 피했다면 다른 방법으로 밝혀 졌을 것입니다. 이전 섹션에 주어진 규칙을 사용하면 모든 기본 요소 의 진실성을 명시 적으로 정의해야합니다 (기본 요소는 수퍼 클래스를 공유하지 않으며 null기본 요소에 대해 잘 정의 되어 있지 않기 때문에 ). 이것은 빠르게 악몽으로 변할 것입니다.

시야

글쎄, 결국 언어 디자이너가 선호하는 것일 수도 있습니다. 각 언어는 거기에서 자신의 길을 돌리는 것처럼 보입니다 ...

예를 들어, Ruby에는 기본 유형이 없습니다. 문자 그대로 모든 것이 대상입니다. 그들은 모든 객체가 특정 방법을 가지고 있는지 확인하는 매우 쉬운 시간을 가지고 있습니다.

루비는 당신이 던질 수있는 모든 종류의 물건에 진실성을 찾습니다. 흥미롭게도, 그것은 여전히이없는 boolean(가 더 프리미티브가 없기 때문에) 타입을, 그리고 는 더이 없습니다 Boolean중 클래스를. 값에 어떤 클래스가 있는지 물어 보면 true(손으로 사용할 수 있음 true.class) 얻을 수 TrueClass있습니다. 이 클래스에는 실제로 메서드가 있습니다. 즉 부울 ( | & ^ ==)에 대한 4 연산자입니다 . 여기서, if그 중 하나의 경우에만, 그 값을 고려 falsey false또는 nil합니다 ( null루비). 그 밖의 모든 것이 사실입니다. 그래서, 0또는 ""둘 다 사실입니다.

Object#truthy?모든 클래스에 구현할 수 있는 방법을 만들어 개인의 진실성을 돌려주는 것은 사소한 일이었습니다. 예를 들어, String#truthy?비어 있지 않은 문자열에 대해서는 true로 구현되었을 수 있습니다. 비록 루비가 대부분의 부서에서 Java의 반 체가되었지만 (믹스 인, 재 개방 클래스 등을 사용한 동적 오리 타이핑) 그렇지 않았습니다.

$value <> 0 || length($value)>0 || defined($value)진실에 익숙한 Perl 프로그래머에게는 놀라운 일입니다. 등등.

null어떤 식 으로든 어떤 식 으로든 자동으로 거짓이 된다는 규칙을 사용하여 SQL을 입력하십시오 . 그래서 (null==null) = false. 루비에서 (nil==nil) = true. 행복한 시간.


실제로 ((int)3) * ((float)2.5)Java로 잘 정의되어 있습니다 ( 7.5f).
Paŭlo Ebermann

당신은 맞습니다, @ PaŭloEbermann, 나는 그 예를 삭제했습니다.
AnoE

우와 저기 ... downvoters와 실제로 답변을 삭제하기 위해 투표 한 사람의 의견에 감사드립니다.
AnoE

실제로에서 int로 변환하면 float일반적으로 정보가 손실됩니다. Java는 또한 암시 적 캐스트를 금지합니까?
Ruslan

@Ruslan no (long → double과 동일) – 아이디어는 잠재적 인 정보 손실이 가장 중요하지 않은 장소에만 있고 중요하지 않은 것으로 간주되는 경우에만 발생한다는 것입니다.
Paŭlo Ebermann

1

다른 훌륭한 답변 외에도 언어 간의 일관성에 대해 이야기하고 싶습니다.

수학적으로 순수한 if 문을 생각할 때 조건은 다른 값이 아닌 참 또는 거짓 일 수 있음을 이해합니다. 모든 주요 프로그래밍 언어는이 수학적 이상을 존중합니다. 부울 true / false 값을 if 문에 제공하면 항상 일관되고 직관적 인 동작을 기대할 수 있습니다.

여태까지는 그런대로 잘됐다. 이것이 바로 Java가 구현하는 것과 Java가 구현하는 것입니다.

다른 언어는 부울이 아닌 값에 편의를 제공하려고합니다. 예를 들면 다음과 같습니다.

  • n정수 라고 가정하십시오 . 이제 if (n)약칭으로 정의하십시오 if (n != 0).
  • x부동 소수점 숫자 라고 가정하십시오 . 이제 if (x)약칭으로 정의하십시오 if (x != 0 && !isNaN(x)).
  • p포인터 유형 이라고 가정하십시오 . 이제 if (p)약칭으로 정의하십시오 if (p != null).
  • s문자열 유형 이라고 가정하십시오 . 이제 정의 if (s)if (s != null && s != "").
  • a배열 유형 이라고 가정하십시오 . 이제 정의 if (a)if (a != null && a.length > 0).

짧은 if-tests를 제공한다는 아이디어는 디자인과 의견에 차이가 생길 때까지 표면적으로는 좋은 것 같습니다.

  • if (0)C, Python, JavaScript에서 false로 처리됩니다. 루비에서는 사실로 취급됩니다.
  • if ([]) Python에서는 false로 처리되지만 JavaScript에서는 true로 처리됩니다.

각 언어에는 표현을 다른 방식으로 처리해야하는 고유 한 이유가 있습니다. (예를 들어, 루비의 유일한 잘못된 값은 falseand nil이므로 0진실입니다.)

Java는 명시 적 설계를 채택하여 if 문에 부울 값을 제공하도록했습니다. C / Ruby / Python에서 Java로 코드를 신속하게 변환 한 경우 lax if-tests를 변경하지 않고 그대로 둘 수 없습니다. Java로 명시 적으로 조건을 작성해야합니다. 잠시 멈추고 생각하면 실수로 인한 실수를 막을 수 있습니다.


1
당신은 그것 x != 0과 같은 것을 알고 x != 0 && !isNaN(x)있습니까? 또한 일반적 s != null으로 포인터 용이지만 포인터가 아닌 다른 것입니다.
중복 제거기

@Deduplicator는 같은 언어로 어떤 언어입니까?
Paŭlo Ebermann

1
IEEE754를 사용하면 NaN ≠ 0. NaN ≠ 무엇이든 사용할 수 있습니다. 따라서 (x)가 실행되고 (! x)도 실행되는 경우 ...
gnasher729

0

음, C, 포인터, 부울 (C99 이후), 숫자 (부동 소수점 여부) 및 열거 (숫자에 직접 매핑하기 때문에)의 모든 스칼라 유형에는 "자연적인"잘못된 값이 있으므로 모든 조건식에 충분합니다. .

Java에는 Java 포인터가 참조라고하며 제한이 많이 있더라도 Java 5.0에 자동 복싱이 도입되어 용납 할 수없는 물을 흐트러 뜨립니다. 또한 Java 프로그래머는 더 많이 입력하는 본질적인 가치를 권장합니다.

부울 유형에 조건식을 제한하는 것은 비교 의도 된 과제, 쓰기의 오타인지 논쟁 양산 한 오류 하지 조건식 유형을 제한함으로써 해결 전혀를 하지만, 벌거 벗은 할당 표현의 불허를 사용하여 그 가치.

최신 C 또는 C ++ 컴파일러는이를 쉽게 처리하여 요청이있을 경우 이러한 의심스러운 구성에 대해 경고 또는 오류를 표시합니다.
의도 한대로 정확하게 괄호를 추가하면 도움이됩니다.

요약하면, 부울 (및 Java의 상자 등가)로 제한하는 =것은 할당 컴파일 오류를 선택하여 발생하는 오타 클래스를 만들지 못한 것처럼 보입니다 .


==부울 피연산자와 함께 사용 하면 첫 번째 변수 는 다른 유형보다 훨씬 덜 자주 발생 하는 변수입니다 (따라서 오타가 발생할 수 있음 =) if.
Paŭlo Ebermann

0.0-> false 및 0.0-> true 이외의 값을 갖는 것이 전혀 "자연스럽지"않습니다.
gnasher729

@ PaŭloEbermann : 불행한 부작용으로 인한 부분적인 결과는 부작용없이 목표를 달성 할 수있는 쉬운 방법이 있지만 저의 책에는 분명 실패입니다.
중복 제거기

다른 이유가 없습니다. 무엇의 truthy 값에 대한 "", (Object) "", 0.0, -0.0, NaN, 빈 배열, Boolean.FALSE? 특히 마지막 것은 널이 아닌 포인터 (참)이므로 거짓으로 개봉됩니다. +++ 나는 또한 글쓰기를 싫어 if (o != null)하지만 매일 몇 문자를 절약하고 "영리한"표현을 디버깅하는 데 반나절을 보내는 것은 좋지 않습니다. 즉, Java의 중간 방법을보고 싶습니다. 더 관대 한 규칙이지만 모호하지는 않습니다.
maaartinus

@maaartinus : 내가 말했듯이, Java 5.0에서 자동 언 박싱 (un-unboxing)을 도입했다는 것은 포인터에 대한 널 (null-ness)에 진실 값 대응을 할당한다면 상당히 문제가 될 수 있다는 것을 의미했다. 그러나 그것은 자동 (un) 박스에 관한 문제입니다. C와 같은 자동 (un-) 복싱이없는 언어에는 행복하지 않습니다.
중복 제거기

-1

내 질문은 나쁜 코딩 스타일과 관련이 없습니다. 나는 그것의 나쁜 것을 알고 있지만, 왜 C가 그것을 허용하고 자바를 허용하지 않는지에 혼란을 느낀다.

Java의 디자인 목표 중 두 가지는 다음과 같습니다.

  1. 개발자가 비즈니스 문제에 집중할 수 있도록합니다. 가비지 수집과 같이 작업을보다 간단하고 오류 발생이 줄 이도록하여 개발자는 메모리 누수에 집중할 필요가 없습니다.

  2. 휴대용 예를 들어 플랫폼 사이에 어떤 CPU를 가진 컴퓨터에서 실행됩니다.

표현으로 할당을 사용하면 오타로 인해 많은 버그가 발생하는 것으로 알려져 있으므로 위의 목표 # 1에서 사용하려는 방식이 허용되지 않습니다.

또한, (예, 믿거 나 말거나, 제로가 아닌 값이 true = 및 제로 값 = 거짓이 반드시 휴대용 아니라고 추론 일부 시스템 사실로 0을 치료하고 1 거짓 등 ), 그래서 위의 목표 # 2에서 암시 적으로 허용되지 않습니다 . 물론 명시 적으로 캐스팅 할 수 있습니다.


4
Java 8에 추가되지 않은 한 숫자 유형과 부울 사이에 명시 적 캐스트는 없습니다. 숫자 값을 부울로 변환하려면 비교 연산자를 사용해야합니다. 부울 값을 일반적으로 삼항 연산자를 사용하는 숫자 값으로 변환합니다.
피터 테일러

이러한 오타로 인해 해당 값에 할당을 사용하지 못하게 할 수 있습니다. 그러나 Java에서 == true 및 == false를 보는 빈도를 고려할 때 제어 표현식을 (선택적으로 박스형) 부울 유형으로 제한하는 것은 그다지 도움이되지 않습니다.
중복 제거기

Java는 이식성이 확실하게 Java의 0이고 Java의 false이므로 "일부 시스템은 0을 true로, 1을 false로 취급"합니다. OS가 그것에 대해 어떻게 생각하는지는 중요하지 않습니다.
maaartinus

-1

예를 들어 다른 언어의 기능 : Swift에는 "BooleanType"프로토콜을 지원하는 유형의 표현식이 필요합니다. 즉 "boolValue"메소드가 있어야합니다. "bool"유형은 분명히이 프로토콜을 지원하며이를 지원하는 고유 한 유형을 만들 수 있습니다. 정수 유형은이 프로토콜을 지원하지 않습니다.

이전 버전의 언어에서 선택적 유형은 "BooleanType"을 지원하므로 "if x! = nil"대신 "if x"를 쓸 수 있습니다. "선택적 bool"을 사용하는 것은 매우 혼란 스러웠습니다. 선택적 bool의 값은 nil, false 또는 true이며 b가 nil이면 "if b"가 실행되지 않고 b가 true 또는 false이면 실행됩니다. 더 이상 허용되지 않습니다.

그리고 당신의 시야를 여는 것을 정말로 싫어하는 한 사람이있는 것 같습니다 ...

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