Я получил этот макрос C++ и задаюсь вопросом, что они означают по коду% 2 (знак процента)?C++ Что означает знак процента?
#define SHUFFLE_STATEMENT_2(code, A, B)
switch (code%2)
{
case 0 : A; B; break;
case 1 : B; A; break;
}
Я получил этот макрос C++ и задаюсь вопросом, что они означают по коду% 2 (знак процента)?C++ Что означает знак процента?
#define SHUFFLE_STATEMENT_2(code, A, B)
switch (code%2)
{
case 0 : A; B; break;
case 1 : B; A; break;
}
Это для взятия модуля.
В принципе, это целочисленное представление остатка.
Итак, если вы разделите на 2, вы оставите 0 или 1 в качестве остатка.
Это хороший способ прокрутки чисел, и если вы хотите, чтобы четные строки были одним цветом, а нечетные строки были другими, модуль 2 хорошо работает для произвольного количества строк.
Это значит остаток дивизии. В вашем случае разделите на 2, а остаток будет равен 0 или 1.
Это означает, что по модулю. Обычно (x % 2)
различает нечетные и четные числа.
Thats modulo. Он возвращает то, что осталось после деления:
10/3 даст 3. - 1 слева.
10% 3 дает это 1.
Модульное возвращает остаток, оставшееся после деления. Это полезно, когда вы поставлена задача определения чет/нечет/простых чисел в качестве примера:
Вот пример использования его для поиска простых чисел:
int main(void)
{ Int IsPrime = 1; int n;
cout << "Enter n: ";
cin >> n;
for (int i=1; i<=n; i++)
{
for (int j=2; j <= sqrt(static_cast<double>(i)); j++)
{
if(!(i%j))
{
isPrime=0;
break;
}
}
if (isPrime)
cout << i << " is prime" << endl;
isPrime=1;
}
return 0;
}
В случае кто-то случается, все равно:% действительно возвращает остаток, не модуль. Пока цифры положительны, нет никакой разницы.
Для отрицательных чисел может быть разница. Например, -3/2 может дать два возможных ответа: -1 с остатком -1 или -2 с остатком 1. По крайней мере, как это обычно используется в модульной арифметике, модуль всегда положителен, поэтому первый результат не соответствует модулю.
C89/90 и C++ 98/03 позволяют либо отвечать хотя до тех пор, пока/и% производят ответы, которые работают вместе, чтобы вы могли воспроизвести вход (т.е. -1x2 + -1 -> - 3, -2x2 + 1 = -3).
Для более новых версий стандартов (C99, C11 и C++ 11) выбора больше нет: целочисленное деление должно округлять до нуля. Например, -3/2 должно дать -1 с остатком - 1. -3/2, дающий -2 с остатком 1, больше не допускается.
+1. На мой взгляд, это единственный удовлетворительный ответ. В стандарте упоминается условие (a/b) * b + (a% b) = a. Кроме того, C++ 0x добавит гарантию того, что целочисленное деление всегда округляется до нуля. Это составляет -3/2 = 1 и -3% 2 = -1. – sellibitze
+1. И несколько раз я хотел взять модуль отрицательного числа, но это мгновенная гарантированная ошибка. Это реальный недостаток в C/C++: гарантированно скомпилирован без сбоев и может работать на одной платформе, но мгновенный (и таинственный) сбой при компиляции в другом месте. – Potatoswatter
Это остаток деления. Так как то, как 5, разделенного на 2 имеет остаток 1, потому что 2 входит в 5 2 раза, но это составляет только четыре, и вы получили, что немного больше на конце
5% 2 == 1
Примечание что цена деления не рассчитываются в любом месте, так что если вы хотите, и в целом общее целое значение деления и это остаток
int answer = 5/2;
int remainder = 5 % 2;
cout << "5 divided by 2 is " << answer << " with remainder " << remainder;
«5 делится на 2, 2 с остатком 1»
Оставшихся может быть отрицательным. Стандарт C++ требует только равенства (a/b) * b + (a% b) = a в случае b! = 0 и позволяет целочисленное деление округлять до нуля (C++ 0x даже требует его) – sellibitze
Хотя остаток может быть отрицательным, если дивиденд отрицательный (или делитель, но это здесь 2). Таким образом, в зависимости от того, что такое «код», это может не быть проблемой, и, надеюсь, программист подумал об этом при документировании использования макроса SHUFFLE_STATEMENT_2. –