Язык Си в примерах/Учимся складывать: различия между версиями

(Исправления.)
(→‎Вариант «тернарный»: Новый раздел.)
Заметьте, что каждое простое ''утверждение'' (англ. {{lang|en|statement}}) завершается точкой с запятой.
Одна из самых популярных синтаксических ошибок начинающих программистов — не ставить точку c запятой после утверждений.
 
== Вариант «тернарный» ==
 
Используя условный оператор контекста ''выражения'' (англ. {{lang|en|conditional operator}}), а также приняв во внимание тот факт, что <code>printf</code> проигнорирует «избыточные» аргументы (аргументы сверх количества, требуемого указателями преобразований в указанной первым аргументом строке формата), можно незначительно сократить код [[#Вариант «арифметический»|предыдущего примера]].
 
<source lang="c">
#include <assert.h>
#include <stdio.h>
 
int
main ()
{
double a, b;
int r
= scanf ("%lg%lg", &a, &b);
assert (r == 2);
printf ((b != 0
? ("a + b = %lg\n"
"a - b = %lg\n"
"a * b = %lg\n"
"a / b = %lg\n")
: ("a + b = %lg\n"
"a - b = %lg\n"
"a * b = %lg\n"))
a + b, a - b, a * b,
(b != 0 ? a / b : 42));
return 0;
}
</source>
 
В этом варианте, код вновь содержит те же самые строковые константы, что и в предыдущем, однако используется лишь один вызов функции <code>printf</code> — первым аргументом которой (в зависимости от значения переменной <code>b</code>) окажется одна из этих констант.
 
Число 42, которое передается <code>printf</code> пятым аргументом в случае нулевого значения <code>b</code>, может быть произвольным. Поскольку в этом случае функция <code>printf</code> получает строку формата лишь с ''тремя'' указателями формата, фактически использованы будут лишь аргументы с первого (формат) по четвертый (произведение <code>a</code> и <code>b</code>).
 
Общий синтаксис тернарного оператора <code>? :</code> следующий:<ref name="conditional" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=118 WG14 N1570 Committee Draft — April 12, 2011] 6.5.15 ''Conditional operator''</ref>
''выражение'' ? ''если-истинно'' : ''если-ложно''
 
Где ''выражение'' вычисляется первым, после чего, если оно истинно (отлично от 0), вычисляется и становится результатом оператора в целом выражение ''если-истинно''; в противном случае — ''если-ложно''.
 
==Примечания==
3890

правок