[아카이브] 순수수학, 물리학, 화학 등 : 거래와 무관한 두뇌 트레이닝 퍼즐 - 페이지 234

 
Mathemat >> :

그리고 여기에 혼란이 있습니다. 첫 번째 캡(외부 루프)에서 d=0 조건은 다소 짜증스럽습니다. 항상 사실인가요?

예, C에서 확실히(그리고 d는 이것에 대한 증인입니다) 에서 LAST 표현식의 진실이 확인됩니다.

 
2 루프의 디컴파일 :)
 
int a = 10000 , b , c = 2800 , d , e , f [ 2801 ] , g ;
int main ( void ) {
 for ( ; b - c ; ) f [ b + + ] = a / 5 ;
 for ( ; d = 0 , g = c * 2 ; c - = 14 , printf ( "%.4d" , e + d / a ) , e = d % a )
 for ( b = c ; d + = f [ b ] * a , f [ b ] = d % - - g , d / = g - - , - - b ; d * = b ) ;
} 

Цикл выполняется до тех пор, пока выражение b - c оценивается как true. Что такое true в Си? Кажись, любой не нуль. Значит, цикл увеличения b от нуля и заполнения массива f[] выполняется до тех пор, пока b не сравняется с с, т.е. до 2800. Массив f[] заполняется одинаковыми числами 10000/5 = 2000.

Пока не сильно ошибся?

첫 번째 루프에서 b = c = 2800. (루프는 "for(;0;)"과 비슷할 것입니다.) 그러나 루프는 여전히 한 번 실행됩니다. 그런 다음 숫자 a/5 또는 2000이 셀 f[2800]에 기록됩니다(b=2800). b 이후에 b는 1씩 증가하고 b는 2801이 됩니다.
 

http://www.languagec.info/oper_for.php:

for ( выражение 1 ; выражение 2 ; выражение 3 ) тело

Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.

Схема выполнения оператора for:

1. Вычисляется выражение 1.

2. Вычисляется выражение 2.

3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.

내부 루프에 집중합시다. 그래서:

for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);

b=c에서 시작하여,

조건하에

d+=f[b]*a,f[b]=d%--g,d/=g--,--b

수행

d*=b

특히 조건을 이해하는 것이 필요합니다. 그것들은 모두 할당 연산자 입니다.

 

MetaDriver писал(а) >>

// 실제로 ( ; g = c * 2 ; ) 이 버전에서 훨씬 더 좋아 보일 것 입니다 : g = c * 2 ; g != 0 ; )

아니오, 작동하지 않습니다. g = c * 2 - 각 주기에서 다시 계산해야 합니다.

다음 버전:

 while ( g != 0 ) 
{
d = 0 ;
b = c - 1 ;
   while ( b!=0 )
{
b -- ;
d + = f [ b ] * a ;
g
--;
 f [ b ] = d % g;
 d / = g ;
g - - ;
d * = b;
}
c - = 14 ;
g = c * 2 :
 
printf ( "%.4d" , e + d / a ) ;
e = d % a;

}

 

if가 없으므로 작동하지 않습니다.

다시 한 번, 조건을 이해해야 합니다. 이것이 가장 중요합니다. 튜토리얼에서 이것을 어디에서 찾을 수 있는지 알 수 없습니다.

 
Mathemat >> :

http://www.languagec.info/oper_for.php:

내부 루프에 집중합시다. 그래서:

b=c에서 시작하여,

조건하에

d+=f[b]*a,f[b]=d%--g,d/=g--, --b
수행

특히 조건을 이해하는 것이 필요합니다. 그들은 모두 할당 연산자입니다.

단 하나 의 조건이 있습니다. 우리는 다른 모든 것을 바깥쪽으로 다시 씁니다.

 
Mathemat >> :

if가 없으므로 작동하지 않습니다.

다시 한 번, 조건을 이해해야 합니다. 이것이 가장 중요합니다. 튜토리얼에서 이것을 어디에서 찾을 수 있는지 알 수 없습니다.

"쉼표 연산자"를 읽으십시오. :)

 

Операция последовательного вычисления обозначается запятой (,) и используется для вычисления двух и более выражений там, где по синтаксису допустимо только одно выражение. Эта операция вычисляет два операнда слева направо. При выполнении операции последовательного вычисления, преобразование типов не производится. Операнды могут быть любых типов. Результат операции имеет значения и тип второго операнда. Отметим, что запятая может использоваться также как символ разделитель, поэтому необходимо по контексту различать, запятую, используемую в качестве разделителя или знака операции.

그리고 마지막을 제외한 모든 것에 대한 거부는 어디에 있습니까?

더:

C 언어에서 할당은 표현식이기도 하며 이러한 표현식의 값은 할당되는 값입니다.

여기서 나는 할당의 무리가 그들이 서있는 위치에 따라 평가되는 표현이라고 말하고 있습니다. 허위 사실.

2 C-4: 첫 번째 루프의 bc 피연산자를 할당으로 해석하는 것이 명확하지 않습니다.

 
Mathemat >> :
Операция последовательного вычисления обозначается запятой (,) и используется для вычисления двух и более выражений там, где по синтаксису допустимо только одно выражение. Эта операция вычисляет два операнда слева направо. При выполнении операции последовательного вычисления, преобразование типов не производится. Операнды могут быть любых типов. Результат операции имеет значения и тип второго операнда. Отметим, что запятая может использоваться также как символ разделитель, поэтому необходимо по контексту различать, запятую, используемую в качестве разделителя или знака операции.

이 컨텍스트에서 두 번째 = 마지막입니다. 형식적 정의는 재귀적입니다. 두 번째 연산자는 복합일 수 있습니다(그리고 다시 쉼표를 포함).