2013-07-19 2 views
2

Это предложение из книги «Язык программирования C».Как понять порядок операций

for (i = 0; i < n; i++) 
     printf("%6d%c", a[i], (i%10==9 || i==n-1) ? '\n' : ' '); 

объяснение: «этот цикл выводит п элементов массива, 10 в каждой строке, в каждой колонке, разделенные одним пробелом, и с каждой строкой (включая последний) завершаются символом новой строки»

Два вопросы:

  1. Разве это понятно? Я смотрю на это в течение часа, и одна вещь, которую я могу сказать - это шутка
  2. Действительно ли программисты используют такие выражения в одной строке?

Благодаря

+0

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence узнать о Operator старшинства, ассоциативности в частности – user2485710

+0

Да он печатает 10 массив 'а [я]' элементы в строке. Да, мы используем его в написании небольшого кода. –

+0

Это не очень читаемо, но с ним не будет проблем после у вас больше опыта чтения кода. – ejno

ответ

0

Порядок операций для сегмента кода:

for (i = 0; i < n; i++) 
     printf("%6d%c", a[i], (i%10==9 || i==n-1) ? '\n' : ' '); 
  1. Как вы входите в цикл, я есть установите на 0.
  2. Прежде чем перейти к телу (printf), i проверяется, чтобы он был меньше n. Если это так, переходим к printf, иначе мы завершаем цикл.
  3. Printf не может быть вызван до тех пор, пока не будут вычислены его аргументы. Порядок вычисления аргументов не определен - они могут произойти в любом порядке, но это редко имеет значение.
  4. a [i] - простой поиск массива, но это не проблема.
  5. Каждый раз, когда вы видите (выражение0)? expression1: e2, выражение 0 оценивается по истине. Если это «истина» (логическое значение true, ненулевое целое число и т. Д.), Тогда выражение expression1 вычисляется и заменяется всем условным выражением. Если выражение 0 является «ложным» (логическое значение false, нулевое целое число, указатель NULL и т. Д.), Тогда выражение expression2 заменяет все условное выражение.
  6. printf вызывается с его вычисленными аргументами.
  7. я увеличивается в течение цикла (я ++) и мы возвращаемся к шагу 2.

The запутанной магии в условном выражении довольно аккуратно, на самом деле. Автор говорит: «В любое время, когда мы только что напечатали 10-е значение в строке или последнее значение во всем наборе, прикрепите символ новой строки после значения, которое мы только что напечатали.В противном случае напечатайте пробел, чтобы отделить это значение от следующего. «I% 10 будет только равным 9, когда i равно 9, 19, 29 .... и я будет равен n-1, когда мы печатаем последний элемент.

Таким образом, выражение 0 в нашем случае истинно, когда i равно 9, 19, 29 ... или n-1. В этих случаях (i%10==9 || i==n-1)?'\n':' ' оценивает просто «\ n», что делает целое заявление: printf("%6d%c", a[i], 'n'); в противном случае, это printf("%6d%c", a[i], ' ');

+0

Спасибо! Очень хороший ответ, я действительно понял все шаги и все выражение. Теперь это выглядит так просто и ... красивый кусок кода ... – Ilan

0

Да это! И нет, это не шутка! Я думаю, что у вас есть проблемы с выражением

(i%10==9 || i==n-1) ? '\n' : ' ' 

Он утверждает, что;

Если счетчик i является 9 т.е. это последний элемент строки или i является последним элементом массива a[n] затем перейти к следующей строке другому месту пространства между два последовательными элементом массива.

Очень просто понять (если у вас есть какое-то представление о conditional operator)

+0

i% 10 == 9 - Я понимаю, что это остаток от i/10, и весь оператор говорит, что если остаток от i/10 равен 9 (и единственным случаем является то, что в конце всего 9) OR (blablabla), чем ... добавить .. \ n, если T или пробел, если F. Я на правильном пути? – Ilan

+0

@Ilan; Да, вы на правильном пути. 'i% 10 == 9' становится истинным для каждого' i', который всего на один меньше, чем у кратного '10', то есть' 20', '30',' 40' ......... . – haccks

+0

теперь код выглядит даже красивым ... – Ilan

Смежные вопросы