오류, 버그, 질문 - 페이지 2889

 
A100 :

당신의 난수는 0이고 내 난수는 540016640입니다.

그러나 그것은 여전히 임의입니다

이미 MQ가 재설정되었다고 생각했습니다.

 
Roman :

이미 MQ가 재설정되었다고 생각했습니다.

전역 변수를 사용하면 0으로 초기화되는 것처럼 보이지만 함수 본문에서 첫 번째 패스에서 다른 초기화를 만났습니다. 나는 항상 사용하기 전에 초기화를 시도합니다. 동의하지만 행동이 모호하지 않아야 합니다.

그리고 괄호 안에 있는 루프 본문의 또 다른 선언은 변수를 루프에 로컬로 만듭니다. 있는 그대로 받아들입니다. 문서에 존재하지 않을 뿐입니다.

 
Roman :

또한 컴파일러는 변수가 초기화 되지 않았다고 경고하지 않습니다 .

매개변수 가 const가 아닌 참조에 의해 전달된 것처럼 Print(...)는 경고하지 않을 수 있습니다.

 int f( int & i ) { return i; }
void OnStart ()
{
         int i;  
        f( i ); //нормально
}
 
A100 :

루프가 동일하면 컴파일러의 동작은 동일해야 하지만 다릅니다. 여기에 오류가 있습니다. (1)의 경우 경고가 표시되는 이유를 설명하고, (2)의 경우에는 표시되지 않는 이유를 설명했습니까? 근본적으로 달라진 점은 무엇입니까? 그런 다음 초기화되지 않은 변수를 사용하면 실행 시 최종 결과가 올바른 이유가 무엇입니까? 이 경우 난수가 있어야 합니다.

그런 과학 논리 가 있습니다. A와 B가 동일하고 A가 빨간색이면 B도 녹색 이 아니라 빨간색 이어야 합니다.

나는 프로그래머가 되기 위해 공부한 것이 아니라 Vasily Ivanovich와 Petka가 논리에 대해 이야기한 방법을 논리적으로 추론할 수 있을 뿐입니다.

첫 번째 경우에는 전체 행이 실행됩니다.

 for ( int i = 0 , j; i < 10 ; i = j )

여기서 변수 j는 초기화되지 않았지만 그 값은 변수 i에 할당됩니다.

두 번째 경우에는 변수 j가 초기화되지 않았 음에도 불구하고 다음 줄에서 변수가 사용되는 곳에서 값이 할당되지 않고 값이 할당됩니다. 즉, 변수 j는 변수 i의 값으로 초기화됩니다.

다음은 경고가 없는 버전입니다.

   for ( int i = 0 , j; i < 10 ; j = i )
   {
    j = i+ 1 ;
   }
 
Alexey Viktorov :

나는 프로그래머가 되기 위해 공부 한 것이 아니라 Vasily Ivanovich와 Petka가 논리에 대해 이야기한 방법을 논리적으로 추론할 수 있을 뿐입니다.

첫 번째 경우에는 전체 행이 실행됩니다.

여기서 변수 j는 초기화되지 않았지만 그 값은 변수 i에 할당됩니다.

그리고 누가 공부했습니까? 나는 여기(나처럼) 대부분이 독학했다고 생각한다

일련의 동작을 이해하려면 for 루프 문을 연구해야 합니다. (1) 번째 경우, 변수 j에 값 i+1이 할당됩니다.

j = i+ 1

할당 연산자의 오른쪽에 나타나기 전에

i = j
 
Valeriy Yastremskiy :

전역 변수를 사용하면 0으로 초기화되는 것처럼 보이지만 함수 본문에서 첫 번째 패스에서 다른 초기화를 만났습니다.
나는 항상 사용하기 전에 초기화를 시도합니다. 동의하지만 행동이 모호하지 않아야 합니다.

그리고 괄호 안에 있는 루프 본문의 또 다른 선언은 변수를 루프에 로컬로 만듭니다. 있는 그대로 받아들입니다. 문서에 존재하지 않을 뿐입니다.

예, 또한 항상 변수를 초기화합니다. 두 번 2와 같으므로 항상 기억해야 합니다.
C 언어에서 헤드로 구동))
따라서 초기화되지 않은 변수가 있는 루프의 이 예는 나쁜 습관입니다.

 
Roman :

예, 또한 항상 변수를 초기화합니다. 두 번 2와 같으므로 항상 기억해야 합니다.
C 언어에서 헤드로 구동))
따라서 초기화되지 않은 변수가 있는 루프의 이 예는 나쁜 습관입니다.

초기화가 필요하지만 의미 있는 값으로만 해야 합니다. 이 예에서는 그러한 값이 없으므로 연습이 나쁘지 않고 유일하게 가능한 것입니다. 그렇지 않으면 이중 초기화가 발생합니다.

 int f( int i ) { /*вычисления*/ }
void g( int k )
{
         for ( int i = 0 , j; i < k; i = j )
        {
                j = f( i );
                 /*вычисления*/
        }
}
 
A100 :

초기화가 필요하지만 의미 있는 값으로만 해야 합니다. 이 예에서는 그러한 값이 없으므로 연습이 나쁘지 않고 유일하게 가능한 것입니다. 그렇지 않으면 이중 초기화가 발생합니다.

그리고 무엇이 바뀔까요? 초기화하면

 int f( int i ) { /*вычисления*/ }
void g( int k )
{
   for ( int i= 0 , j= 0 ; i < k; i = j )
   {
      j = f( i );
       /*вычисления*/
   }
}       
 
Roman :

그리고 무엇이 바뀔까요? 초기화하면

그리고 j=333이 아닌 0이 허용되는 이유는 무엇입니까? 저것들. 미묘한 오류를 숨길 수 있는 의미 없는 초기화입니다.

 
A100 :

그리고 333이 아닌 0이 허용되는 이유는 무엇입니까? 저것들. 미묘한 오류를 숨길 수 있는 의미 없는 초기화입니다.

이 값의 오류를 잡아야 한다면 음, 333 으로 초기화하세요))
이것은 시작 값일 뿐입니다.