[アーカイブ!】純粋数学、物理学、化学など:トレードとは一切関係ない脳トレ問題集 - ページ 234

 
Mathemat >>:

А вот дальше непонятка. В первой шапке (внешнем цикле) условие d=0 как-то напрягает. Это ж всегда true?

C言語では、確かに(そしてdがその証人となる)、forは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;)」となります)しかし、ループはまだ一回実行されます。すると、セルf[2800]にa/5つまり2000が書き込まれる(b=2800)。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 писал(а) >>

// 実際のところ、for(; g=c*2; ) は、 このバージョンの方がずっと見栄えが良いだろう。

いや、そういうわけにもいかない。 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が1つもない、そんなことはないでしょう。

もう一度言いますが、条件を理解すること、それが一番のポイントです。教科書のどこに書いてあるのか、さっぱりわからない。

 
Mathemat >>:

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

Давай лучше на внутреннем цикле сосредоточимся. Итак:

Начиная с b=c,

при условиях

d+=f[b]*a,f[b]=d%--g,d/=g--,--b
выполняется

Особо надо понять условия, т.к. это все операторы присваивания.

条件は1 つで、それ以外はすべて外側に書き換えます。

 
Mathemat >>:

У тебя нет ни одного if, так не пойдет.

Еще раз, нужно разобраться в условиях, это главное. Я никак не пойму, где это найти в учебнике.

演算子コンマ」と読みます。:)

 

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

そして、最後の1つ以外の廃棄はどこにあるのでしょうか?

また

SI言語では、代入も式であり、その値は代入された値である。

つまり、多くの課題は式であり、その立ち位置、つまりtrue/falseによって評価されるのです。

2 C-4: 一番最初のループのb-cオペランドを代入と解釈しているのは、私にはよくわからないのですが。

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

この文脈では、2番目=最後ということになります。形式的な定義は再帰的であり、すなわち2番目の演算子は複合的である(そして再びカンマを含む)ことが可能である。