2011-12-19 3 views
19

부동 소수점에 증가 연산자 (++)를 사용하는 것이 "잘못된 스타일"로 간주됩니까? 그것은 잘 컴파일하지만 나는 냄새 나는 반 직관적 인 것을 발견했습니다.부울 스타일에 증분 (연산자 ++)을 사용하고 있습니까?

질문 : 어떤 경우 float 변수에 ++을 사용하고 += 1.0f보다 우수합니까? 유스 케이스가 없다면 플로트에서 ++가 악하다고 명백하게 말하는 존경 할만한 C++ 스타일 가이드가 있는가?

float ++는 가장 작은 값으로 증가하지 않지만 1.0으로 증가합니다. 1.0f는 특별한 의미가 없습니다 (정수 1과 다릅니다). 독자가 변수가 int라고 생각하게하는 혼동을 줄 수 있습니다.

float의 경우 연산자 ++가 인수를 변경한다는 보장이 없습니다. 예를 들어, 다음 루프는 무한하지 않습니다.

float i, j; 
for (i=0.0, j=1.0; i!=j;i=j++); 

결과적으로 ++를 즉시 수행하면 - 값이 변경되지 않는다고 보장 할 수 없습니다.

+2

j ++와 ++ j 사이에는 큰 차이가 있습니다. – luke

+0

질문 - 답변 쌍을 적절한 질문과 적절한 대답으로 나누지 않는 이유는 무엇입니까? 사람들이 당신과 동의하면 더 많은 표를 얻을 수 있습니다. – vitaut

+3

+1 - 나는 '++'가 "다음 숫자로 넘어가는 것"을 의미하지만 "마법 숫자 1만큼 증가하지"않는다는 것에 동의합니다.그리고 그런 의미에서 부유물을 사용하는 것은별로 의미가 없습니다. 그래도이 질문에 대한 만족스러운 대답이 있을지는 의문입니다. – tenfour

답변

12

일반적으로 ++/--은 float에 대해 정의되지 않습니다. float를 증가시켜야하는 값이 명확하지 않기 때문입니다. 따라서 한 시스템에서 ++f += 1.0f이되는 운이 좋지만 유효하지 않은 상황이있을 수 있습니다. 따라서 수레의 경우 특정 값을 제공해야합니다.

++/--은 "증가/감소 1"로 정의됩니다. 따라서 부동 소수점 값에 적용 할 수 있습니다. 그러나, 개인적으로 나는 이것이 (또는 정수에만 적용됩니다)이 정의를 알지 못하는 사람에게 혼란 스러울 수 있으므로, 나는 f += 1.0f을 사용하는 것이 좋습니다 것이라고 생각합니다. 이 때문에 소수점 연산 부동의, float로 1.0의 제비를 추가 할 때

+4

모든 산술 타입과 포인터에 대해 정의됩니다 : '피연산자 오브젝트의 값은 오브젝트가 bool 타입이 아닌 한 1을 더함으로써 수정됩니다.이 경우에는 참으로 설정됩니다' – fefe

+0

또한 gcc는 불평하지 않습니다 -Wall로 컴파일 할 때 float ++. – Muxecoid

+0

@fefe : 설명 주셔서 감사합니다 –

15

당신은

for (int i = 0; i < 100; i++) 
{ 
    float f = 2.433f + i * 1.0f; 

대신

가장 좋은 방법은 결국 조금을 수 있습니다

for (float f = 2.433f; f < 102.433f; f += 1.0f) 

두 번째 경우에는 부동 소수점 산술 오류가 합산되며 첫 번째 경우에는 그렇지 않습니다. 특정 사용자가 아래의 설명에서 정수를 추가 할 때 실수를 지적했지만 오류를 축적하지는 못했지만 일반적으로이를 피하는 것이 좋습니다.

+4

예. (그러나 왜 1.0f로 곱하면 되는가? float f = 2.433f + i;'충분하다.) – TonyK

+2

@ TonyK 나는 일반적인 증가를 생각하고 있었다. 그리고 증가분을 1.0f로하자. :) –

+2

그것이있는 동안 어떤 분수 값은 float와 같은 정확한 표현을 가지고 있지 않으며, 정수 값은 항상 수행하며, 정수 값을 가진 두 개의 부동 소수점을 더한 결과는 결코 절취 오차를 갖지 않을 것입니다. – Ferruccio

4

나쁜 스타일입니다. ++--은 lvalue를 다음 또는 이전 정수와 같이 배열의 다음 또는 이전 요소 (포인터), 컨테이너 (반복자)의 다음 또는 이전 요소 등과 같이 다음 또는 이전 값으로 설정합니다.

다음 및 이전 값은 float에 대해 잘 정의되어 있지 않습니다. f += 1.을 명시 적으로 수행하십시오.

+2

내가하는 말을 잘 모르겠다. 증분 연산자와 감산 연산자가 무엇이든 할 의도가있는 한 부동 소수점 유형을 포함하여 정의 된 모든 유형을 증가 및 감소시킵니다. 'f + = 1.'과'++ f'의 유일한 차이점은'f'가'f'를 두 배로 늘려 계산을하는 것입니다. –

+1

@Mike : larsmans와 질문자는 부동 소수점 유형에 대해 '++'를 정의하는 것이 C 표준의 실수 (잘못된 스타일)라고 주장합니다. 그들은 다른 타입을위한 연산자의 의도 된 목적에 대한 인식에 기초하고, 정의가 rhs에'1 '을 취하는'+ ='할당 연산자를 가진 어떤 타입에도 적용될 수 있기 때문에 이것을 주장한다. 목적이 적용됨을 의미합니다. –

+0

@SteveJessop : 맞습니다. 동료와 함께 주제에 대한 논쟁이 있었으므로 이제는 내 요점을 지원하는 스타일 가이드를 찾고 있습니다.:) – Muxecoid

9

++--을 부동 소수점 또는 이중 피연산자로 사용할 때 아무런 문제가 없습니다. 그것은 단순히 1을 더하거나 뺍니다. 그것은 그것이 무엇을위한 것입니까!

+0

사실은 여기까지의 행동을 구체적으로 설명하지 않는 '표준'에 따르면 실제로는 사실이 아닙니다. 나는 그것에 의존하지 않을 것입니다. – ScarletAmaranth

+3

@ScarletAmaranth 표준은 동작을 매우 정확하게 지정합니다. (그게 반드시 좋은 생각 인 것은 아닙니다.) –

+0

@ TonyK 제 사과는 훌륭합니다. 이전에 언급 한 내용은 무시하겠습니다.하지만 부동 소수점 해석 문제를 고려하면 부동 소수점을 처리 할 때의 동작은 정의되지 않습니다. 그래서 예, 그것은 단순히 하나씩 증가합니다 :) – ScarletAmaranth

관련 문제