Я ещё только 2 месяца изучаю язык СИ, поэтому у меня очень много ошибок. Я не вижу здесь ошибок, но написано что что-то не так с IF, программа не закончена, но должно работать: - вопрос №1684237

#include «stdio.h»void main (){int a, b, c, i, f;for (i=0;i<5;i++){printf («Vvedite perviy mnozhitel:»);scanf ("%d", &a);printf («Vvedite vtoroy mnozhitel:»);scanf ("%d",&b);printf («Vvedite proizvidenie:»);scanf ("%d",&c);if (c=a*b){i++};}}
28.10.15
4 ответа

Лучший ответ по мнению автора

1 — вообще о текст ошибки это очень ценная информация. стоило его сюда скопировать (а если на английском, на будущее — не ленитесь пользоваться переводчиками, онлайн есть и у гугла, и у яндекса, и у любимого виндой бинга)

2 — в язике Си принято использовать выравнивание — так легче читать — видна структура кода

#include «stdio.h»void main (){
  int a, b, c, i, f;  for (i=0;i<5;i++)  {
    printf («Vvedite perviy mnozhitel:»);    scanf ("%d", &a);    printf («Vvedite vtoroy mnozhitel:»);    scanf ("%d",&b);    printf («Vvedite proizvidenie:»);    scanf ("%d",&c);    if (c=a*b)
    {
      i++
    };
  }}

3 — в некоторых диалектах Си этот код должен и компилироваться без ошибок (в классическом Си логическое значение проверяется на целочисленном), и выполняться (у вас в ифе произойдет присвоение в С произведения А и В, и его результат может быть интерпретирован ифом… в старых Си)… но… в нем пока некоторый напряг со смыслом...

что бы понять где ошибка, надо знать ЧТО Вы вообще хотите запрограммировать? (тот самый смысл, Вы кстати его тоже не сообщили, так что приходится додумывать)

если тут произведение вводит пользователь, а программа его проверяет (не дурак ли пользователь?)

тогда вероятно Вам нужно не присвоение делать

c=a*b

а сравнение на равенство?

c==a*b

и это действительно разные вещи, в новых компиляторах, по умолчанию скорее всего именно из за этого будет ошибка — компилятор требует выполнить действие, результатом которого будет логическое значение, на пример сравнение на равенство, и записывается оно именно так

==
28.10.15
Лучший ответ по мнению автора

Другие ответы

Добрый день.

if (c=a*b) — в данном случае будет вычислено логически (т.е. c присвоено a*b и т.к. присвоение успешно, то результат if будет true),
В с/c++ правильно сравнивать
if (c == a*b)
И да, после i++ должна быть точка с запятой
{i++;}


28.10.15
о точке с запятой — последний оператор в блоке не требут точки с запятой

{
      i++
};

тут ошибки нет

(просто привычка ставит всегда точку с запятой, сама по себе скорее полезна)
28.10.15
уточнение о присвоении:

ни в коем случае присвоение не порождает true

if (c=a*b)

с будет содержать произведение — какое то целое число

но исторически в СИ, целые интерпретировались как истина, если больше и ли равно 0, и как ложь — если отрицательное

но если это компилятор С++, тогда в зависимости от опций он может требовать «настоящего» логического выражения

если это классический Си — все откомпилируется без ошибок… но на СМЫСЛОВУЮ ошибку может указать преподаватель к примеру

зы еще уточнение (полностью эквивалентный код) вот что будет происходить на самом деле

c=a*b
if ( с )

с — целое, а значит это допустимо в традиционном Си, и истинность определяется всего лишь знаком

28.10.15
Посмотреть всех экспертов из раздела Технологии > C/C++
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store