는 무엇입 캐스팅 작업의 순서에서 연산에서는 c++?

0

질문

  1. result = static_cast<double>(1 / (i+1))

return int 에서는 C++및 않는 이유

  1. result = 1 / (i+static_cast<double>(1))

return double? 특히 왜 주 후 +-작업을 생산하기에 충분 double. 그것이 왜 필요하지 않기 + 또는 분자 뿐만 아니라? 가 static_cast 원하는 방법으로 캐스팅?

코드:

double harmonic(int n) {
  double result = 0;
  for (int i = 0; i < n; i++) {
    result += 1 / static_cast<double>(i+1);
  }
  return result;
}
arithmetic-expressions c++ casting types
2021-11-21 13:17:43
3

최고의 응답

2

그런 일이 없으로"캐스팅 주문하기 때문에"식의 유형에 따라 달라집 피연산자를 사용합니다. 단순히 넣어 경우,binary arithmetic operator 지 두 가지의 피연산자는 다른 유형은 다음 작은 종류의 것으로 넓은 입력

result = static_cast<double>(1 / (i+1)) 그것의 분석이

  • i + 1int 식터 i1 의 유형 int
  • 1 / (i + 1) int 를 반환하는 같은 이유
  • 다음의 결과이 1 / (i + 1) 정적으로 캐스팅 double

에서 새로운 result = 1 / (i+static_cast<double>(1)) 그것은 다음과 같이

  • 1 로 캐스팅 double
  • i + static_cast<double>(1)doublei 로 캐스팅 double 으로 인해 다른 연산자
  • 1 / (i+static_cast<double>(1))double 식 같은 이유

그러나 아무도 주와 같습니다. It's better to do 1 / (i + 1.0)

완전한 규칙은 다음과 같이

  • 의 경우 피연산자 중 하나가 범위의 열거형으로 변환이 수행되지 않:다른 연산자와는 반환 형식이 동일해야 합 유형
  • 그렇지 않은 경우,피연산자 중 하나 long double다른 연산자 변환 long double
  • 그렇지 않은 경우,피연산자 중 하나 double다른 연산자 변환 double
  • 그렇지 않은 경우,피연산자 중 하나 float다른 연산자 변환 float
  • 그렇지 않으면,연산자는 정수형(기 bool, char, char8_t, char16_t, char32_t, wchar_t과하지 않는 열거되었으로 승진 이 시점에서)및 필수적인 변환이 적용되을 생산하는 일반적인 유형,다음과 같다:
    • 는 경우에는 모두 피연산자가 서명 또는 모두가 서명되지 않은 피연산자는 낮은 전환 순위로 변환하여 연산자와 더 정수 변환 순위
    • 그렇지 않은 경우,부호 없는 피연산자의 변환 순위 가 크거나 변환 순위의 서명된 피연산자,서명된 연산자로 변환된 부호 없는 피연산자의 유형입니다.
    • 그렇지 않은 경우,서명된 피연산자의 유형을 나타낼 수 있습의 모든 값을 서명되지 않은 피연산자,서명되지 않은 연산자로 변환하여 서명된 피연산자의 유형
    • 그렇지 않으면 모두 피연산자로 변환되는 서명자의 서명된 피연산자의 유형입니다.

The 변환 순위 위에서 증가기 bool, signed char, short, int, long, long long. 순위의 서명이 없는 형식이 동일하의 서명된 형식입니다. 순위 char 와 같은 순위 signed charunsigned char. 순위 char8_t, char16_t, char32_twchar_t 는 같은 계급의 그들의 기본 형식입니다.

연산자

2021-11-21 13:34:10

대,덕분! 이것은 정확하게 응답을 찾고 있었습니다. 내가 찾는 트릭 1.0 특히 유용합니다!
DataFace
1
static_cast<double>(1 / (i+1));

첫째, 1 / (i+1) 을 얻을 평가합니다. 때문에 1 inti+1int그래서 이것이 나누기,그래서 1/(i+1)int. 결과는 다음으로 배역 double. 그래서 기술적으로, static_cast<double>(1 / (i+1)); 반환 double지만,결과는 잃었기 때문에 1/(i+1) 은 정수 부문

result += 1 / static_cast<double>(i+1);

지금 세 static_cast<double>(i+1) 중, 1 / static_cast<double>(i+1); 지금 부동 소수점 divison,따라서 1 / static_cast<double>(i+1);double

2021-11-21 13:26:20

그리고 물론, 1.0 /(i + 1) 은 더 나은입니다.
Pete Becker
1

의해야 합니다 정수단

이 코드를 사용할 수 있습을 보고,그것이 실제로 반환하는 두 번 있습니다. 그러나,정수,그것은 항상 수로(또는 할머니).

#include <iostream>

using std::cout;

int main()
{
    int i = 5;
    cout << typeid(static_cast<double>(1 / (i+1))).name() << "\n"; // d for double
    return 0;
}

을 피할 수 있는 정수 부여하지 않을 나누는 두 개의 정수입니다. 그 때문에 그것은 충분하는 경우 그들 중 하나입니다

int + double == double
double + int == double
int / double == double
double / int == double

그래서 당신이 볼 수있는,그것은 그분만이 캐스트 하나 급수식을 두 번 돌려하기 위해 전체적인 표현으로 두 배는 항상하지 않습니다.

2021-11-21 13:30:50

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................