Несколько операторов if в C

#c #if-statement

#c #if-оператор

Вопрос:

Я решаю первую задачу project euler, и я только что сделал это

 #include <iostream>
using namespace std;

int main(){

int threes =0;
int fives = 0;
int both = 0;
for (int i = 0; i < 10; i  ){
      
       if(i%3==0){
   threes  = i;
   }
  
       if(i%5==0){
   fives  = i;
   }
   
      if ( i % 5 == 0 amp;amp; i % 3 == 0){
      both  = i;
  }

}

cout << "threes = " << threes << endl;
cout << "fives = " << fives << endl;
cout << "both = " << both << endl;

cout << " threes   fives - both = " << endl;
int result = (threes   fives) - both;
cout << result<< endl;

return 0;
}
  

Мой профессор недавно поправил меня за то, что я делал это в другой задаче, сказав что-то о else заявлениях,
но я не понимаю, ПОЧЕМУ я должен добавлять else перед следующим if . как бы то ни было, у меня есть другая версия с else if(i%5){ fives = .... }
и они оба работают и дают мне правильный ответ.

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

Если это работает, зачем вообще использовать операторы switch?

Комментарии:

1. Исходя из вопроса: бьюсь об заклад, что вы не должны увеличивать, both если вы также увеличиваете three и five . т. е. каждый раз, когда в цикле требуется увеличивать только одну переменную.

Ответ №1:

Единственное, что я вижу неправильного в вашей реализации, это то, что в случае, когда число одновременно кратно 3 и кратно 5, увеличиваются не только обе переменные, но также переменные fives и threes. Основываясь на том, что описал профессор, я полагаю, что он хочет, чтобы вы использовали else-if, чтобы переменная both была единственной, которая увеличивается при передаче числа, кратного как 3, так и 5.

Причина, по которой вы получаете правильный ответ обоими способами, заключается в том, что в цикле for вы получаете только 10, если вы увеличите его до i <= 15, вы получите пятерки и тройки на 1 больше, чем, я думаю, он предполагал.

Например:

 for( int i = 0; i < 10; i   )
{
   if( ( ( i % 3 ) == 0 ) amp;amp; ( ( i % 5 ) == 0 ) )
   {
      both  ;
   }
   else if( ( i % 3 ) == 0 )
   {
      threes  ;
   }
   else if( ( i % 5 ) == 0 )
   {
      fives  ;
   }
}
  

Комментарии:

1. комментарий профессора, который я сделал, был для другой проблемы. На самом деле мне вообще не нужна переменная both. Моя окончательная реализация — if (i% 3 == 0){ threes = i; } else if (i % 5 == 0) { fives = i; } Мне не нужны оба, потому что число, подобное 15, будет истинным для части 3 и, таким образом, пропустит оператор 5, поэтому все числа подсчитываются только один раз. это странно, потому что у меня было три идеи / реализации, и все они дали мне правильный ответ…

Ответ №2:

else Ветвь в if-else инструкции выполняется только в том случае, если if ветвь является false . Если у вас есть только два if оператора подряд, они оба будут выполнены, что может оказаться пустой тратой времени. В приведенном ниже коде else предотвращает выполнение второго вычисления, если выполнено первое.

 if (expensive_computation1()) {
  ...
}
else if (expensive_computation2()) {
  ...
}
  

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

Ответ №3:

В этом случае, возможно, вы действительно хотите этого:

 if (i % 5 == 0 amp;amp; i % 3 == 0) {
    both  = i;
} else if (i % 3 == 0) {
    threes  = i;  
} else if (i % 5 == 0) {
    fives  = i;
}
  

(почему вы делаете = i вместо , я не знаю, но вы не объяснили, поэтому я просто скопировал это)

В вашем коде threes и fives были увеличены, даже если они также увеличились бы both , что в зависимости от вашей проблемы может быть не тем, что вы хотите. Если вы выполняете только что представленный мной способ if / else, увеличивается только одна из трех переменных.

Комментарии:

1. первоначальный вопрос был: «Найдите сумму всех чисел, кратных 3 или 5, меньше 1000». Я хочу сложить числа, а не отслеживать, сколько их существует, поэтому сделал = . На самом деле я избавился от обеих идей. в этом не было необходимости. тем не менее, спасибо, что каждый ответ помог

Ответ №4:

Зачем использовать if-else вместо multiple if's ?
if-else amp; if достигло бы тех же результатов, но if-else достигло бы их способом, повышающим производительность. при использовании нескольких if's каждое условие if должно быть проверено. С if-else потребуется выполнить только одну условную проверку, а остальные условия просто не нужно проверять вообще.

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

Если это работает, зачем вообще использовать операторы switch?
С вложенными if-else условиями код трудно читать и понимать. switch-case Конструкция помогает представить условия в гораздо более удобном для чтения и понимания формате.

Ответ №5:

Для меня это выглядит как стилистика. Вы можете использовать какой-нибудь инструмент автоматического форматирования, который соответствует определенному установленному стилистическому виду (K amp; R, ANSI, GNU и т.д.)

Например, astyle является таким инструментом,http://astyle.sourceforge.net / — просто переформатируйте свой код с его помощью, и у вас может быть счастливый профессор.