Правильность записи

249
11 февраля 2018, 00:46
#include <cstdlib>             Иногда нумерация дублируется вопросов.  
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
system("chcp 1251>nul");
int a,A,B,C,D,E;
//  const int    //Размер массива
a=5;
srand(time(NULL));   //Инициализация генератора случайных чисел
int nums[a];       // Создание массива
for (int a=1;a<=5;a++){
nums[a] =1+rand()%(31);
cout<< "\t Вопрос № -  "<<  nums[a] <<endl;
cout<<"\n";
}

A=nums[1];
B=nums[2];
C=nums[3];
D=nums[4];
E=nums[5];
if(A==B&&C&&D&&E){                              //  Не работает
A=32;
}
else{
A=nums[1];
}
if(B==C&&D&&E){
B=33;
}
else{
B=nums[2];
}
if(C==D&&E){
C=34;
}
else{
C=nums[3];
}
if(D==E){
D=35;
}
else{
D=nums[4];
}
cout<<"\n"<<"\t A="<< A<<endl;
cout<<"\n"<<"\t B="<< B<<endl;
cout<<"\n"<<"\t C="<< C<<endl;
cout<<"\n"<<"\t D="<< D<<endl;
cout<<"\n"<<"\t E="<< E<<endl;
cout<<"\n"<<"\t nums="<<nums[1] <<endl;
cout<<"\n"<<"\t nums="<<nums[2] <<endl;
cout<<"\n"<<"\t nums="<<nums[3] <<endl;
cout<<"\n"<<"\t nums="<<nums[4] <<endl;
cout<<"\n"<<"\t nums="<<nums[5] <<endl;

return 0;
}
Вопрос:После запуска генератора сл.чисел выводится одинаковые числа. Чтобы 
этого не происходило добавил проверку с оператором if. Однако при сравнении 
в 1-ом и 2-ом оператор не работает, почему не понимаю. Программа ошибок не 
находит.
Answer 1

Выражение A == B && C && D && E с учётом приоритета операций (приоритет == выше чем приоритет &&, который в свою очередь выше чем приоритет ||) и с учётом ассоциативности оператора && (также как и у || — слева направо) будет эквивалентно следующему:

(((A == B) && C) && D) && E

Также здесь следует учесть что оператор && (как и ||) вычисляется по сокращённой схеме (short-circuit evaluation).

Для оператора && это означает, что правый операнд вычисляется в том и только в том случае, если левый true.

Для оператора || это означает, что правый операнд вычисляется в том и только в том случае, если левый false.

Более того, левый операнд является упорядоченным перед правым операндом, т.е. все вычисления и побочные эффекты связанные с левым операндом выполняются до всех вычислений и побочных эффектов связанных с правым операндом.

С учётом написанного, порядок вычисления приведённого выше выражения следующий:

  1. Если выражение A == B ложно, то дальнейшие вычисления не производятся, и выражение A == B && C && D && E ложно, иначе
  2. если C ложно, то дальнейшие вычисления не производятся, и выражениеA == B && C && D && E ложно, иначе
  3. если D ложно, то дальнейшие вычисления не производятся, и выражение A == B && C && D && E ложно, иначе
  4. если E ложно, то дальнейшие вычисления не производятся, и выражение A == B && C && D && E ложно, иначе
  5. выражение A == B && C && D && E истинно.

В вашей программе есть несколько ошибок.

Во-первых, размер массива nums должен быть константным выражением, т.е. переменную a следует объявить с квалификатором const:

const int a = 5;

Во-вторых, массивы в C++ нумеруются с нуля. Первый элемент в массиве nums имеет индекс 0, а последний элемент имеет индекс 4. Попытка обращения к несуществующему пятому элементу массива — неопределённое поведение — так делать не нужно.

В-третьих, вы пытаетесь проверить, равна ли переменная A хотя бы одной из переменных B, C, D или E, используя следующее условие:

if (A == B && C && D && E)

и это не верно. В первой части ответа я написал как вычисляется это условие.

Чтобы добиться последовательного сравнения переменной A со всеми остальными переменными используйте логическое или, а именно бинарный оператор ||:

if (A == B || A == C || A == D || A == E)

С учётом приоритета операторов приведённое выше выражение интерпретируется так:

if ( (A == B) || (A == C) || (A == D) || (A == E) )

а с учётом ассоциативности так:

if (    ( ( (A == B) || (A == C) ) || (A == D) ) || (A == E)    )

т.е. тело if выполнится в том и только в том случае, если A равно хотя бы одной из переменных B, C, D или E.

READ ALSO
ошибка компиляции C2228 в std::vector

ошибка компиляции C2228 в std::vector

Имеется программа, парсящая csv файл:

212
Qt.Как создать модульное приложение?

Qt.Как создать модульное приложение?

Как создать модульную структуру проекта, как на рисунке :

236
C++: Преобразование текущего символа string в int

C++: Преобразование текущего символа string в int

Нужно сравнить два числа, количество цифр которых будет равняться вплоть до 10^6 (Тип данных записан как string)Какие помимо этого способа существуют...

279