문제

저자가 절차 대신 C ++ 코드를 선언적으로 작성하려고한다는 점에서 다음 코드가 정확하지 않은 이유에 대한 좋은 설명을 어떻게 만들 수 있습니까?

const double NEWTONS_PER_POUND = 4.448;

int main()
{
   double pounds, newtons;
   pounds = newtons/NEWTONS_PER_POUND; /* pounds equals 'unassigned variable'/4.448 */
   newtons = 10.0;
   cout << pounds << endl;             /* a big number, not 10.0/4.448 */
   return 0;
}

저자는 기대했다 cout 적절한 계산을 표시하지만 대신 "미친 숫자"를 얻습니다.

나는 이것을 "C ++는 절차 적이며, 따라서 선언 당시에"라고 설명합니다.

pounds = newtons/NEWTONS_PER_POUND;

newtons 값이 할당되지 않았습니다.

더 나은 제안이 있습니까? 또는 왜 C ++가 사용자가 실수로 기대하는 행동을 수행하기에 충분히 "스마트"되지 않는가?

도움이 되었습니까?

해결책

저자에게 말하십시오

pounds = newtons/NEWTONS_PER_POUND;

CPU를 명령합니다

  • "Newtons"라고하는 주소에서 값을 취하십시오.
  • "newtons_per_pound"라고하는 주소에서 값을 취하십시오.
  • 그들을 나누십시오
  • "파운드"라고하는 주소에 결과를 저장하십시오.

그가 찾고있는 것은 아마도 가장 중요한 용어로 기능 일 것입니다.

double newtons_to_pounds(double newtons) {
  return newtons/NEWTONS_PER_POUND;
}

...

newtons = 10.0;
cout << newtons_to_pounds(newtons) << endl;    /* a big number, not 10.0/4.448 */
return 0;

다른 팁

C ++는 방정식 솔버가 아닌 명령적인 프로그래밍 언어입니다.

C ++는 당신이 그것들을 쓰는 순서대로 진술을 실행합니다. C ++는 변수가 말하지 않는 한 초기화되지 않습니다. C ++는 값이 초기화되지 않은 변수를 사용할 수 있지만이를 수행하면 결과는 다음과 같습니다. 지정되지 않았습니다. "미친 숫자"를 생산하는 것과 같은 나쁜 일을 포함하여 어떤 일이 일어날 수있는 것보다 지정되지 않은 수단.

자세한 설명은 다음과 같습니다.

double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;

첫 번째 진술은 초기화없이 두 가지 변수를 선언합니다. 이 시점에서 그 값은 지정되지 않습니다.

두 번째 진술은 값을 읽습니다 newtons (무엇이든 될 수 있음) NEWTONS_PER_POUND. 결과 (무엇이든)가 할당됩니다. pounds.

세 번째 성명서는 초기화됩니다 newtons, 그러나 방금 수행 한 계산에 영향을 미치기에는 너무 늦었습니다.

학생들의 배경에 관계없이 설명하기가 너무 어렵지 않아야합니다.

C ++ '이를 처리하는 방법에 특별한 것은 없으며 컴퓨터 프로그래밍으로 제한되지도 않습니다. 오히려 주문한 지침 목록을 다루는 일상적인 방법입니다.

Newtons를 평가하는 것은 게으른 것이 아닙니다

따라서 계산은 요청 시가 아니라 선언 시점에 수행됩니다. 그는 C ++가 할 일이 아니라 기능 코드를 따릅니다.

사람이 지나치게 기술적이지 않으면 시도 할 수 있습니다.

"이 C ++ 프로그램의 진술은 케이크를 만드는 데 필요한 단계와 같습니다. 단계를 하나씩 수행해야하며 성공하기 위해 특정 순서로 수행해야합니다."

파운드는 과제 연산자와 라인에 값을 할당한다고 설명합니다.

pounds = newtons/NEWTONS_PER_POUND;

그렇지 않은 경우, 파운드가 사용될 때 (Cout 문과 같이) 파운드가 평가되면 Newtons의 값이 변경되면 파운드 값도 변경됩니다. 파운드는 어떤 유형의 포인터가 아니지만 간단한 정수이기 때문에 이것은 불가능합니다.

디버거에서 코드를 밟는 것은 어떻습니까?

IME 절차 적 언어로 작성된 프로그램의 실행을 이해하는 것은 없습니다 (즉, CPU가 실제로 코드를 실행하는 방식에 대한 모델링).

청취자가 패러다임 전환을 겪게하려고 노력하고 있습니다.이 코드를 이해하기위한 전체 접근 방식을 변경합니다.

"파운드"는 단지 숫자입니다. 그것은 그것이 어떻게 창조되었는지에 대한 개념이 없습니다. 당신은 "파운드"가 어떻게 만들어 졌는지 말하지만 기억하지 못합니다. 그것은 그것이 어떻게 만들어 졌는지를 기억할 것입니다.

메모리 블록을 의인화하는 것은 조금 이상하게 보일 수 있습니다. :-)

변수와 같은 약간 더 복잡한 예를 들어 newtons 재사용 및 할당 값이 두 번 이상 지정됩니다. 예를 들어:

double pounds, newtons;

newtons = 10.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

newtons = 15.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

return 0;

그에게 코드와 출력을 모두 보여줍니다. 그런 다음 프로그램이 각 라인마다 다른 숫자를 생성하는 방법과 이유를 설명하도록 요청하십시오. 나는 그것이 프로그램을 위에서 아래로 실행되는 절차로 보는 방향으로 그를 밀어내는 데 도움이 될 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top