#include <stdio.h>
int main()
{
char c;
c=10;
if(c%2==0)
printf("Yes");
return 0;
}
Приведенный выше код печатает «Да». Может кто-нибудь сказать, почему оператор модуля работает для char
и int
, но не для double
и т. д.?
#include <stdio.h>
int main()
{
char c;
c=10;
if(c%2==0)
printf("Yes");
return 0;
}
Приведенный выше код печатает «Да». Может кто-нибудь сказать, почему оператор модуля работает для char
и int
, но не для double
и т. д.?
Вы уже получили комментарии, объясняющие, почему %
определено для char
: оно определено для всех целочисленных типов, а в C char
является целочисленным типом. Некоторые другие языки определяют отдельный тип char
, который не поддерживает арифметические операции, но C не входит в их число.
Но чтобы ответить, почему он не определен для типов с плавающей запятой: history. Нет технической причины, по которой было бы невозможно определить оператор %
для типов с плавающей запятой. Вот что говорит обоснование C99:
6.5.5 Мультипликативные операторы
[...]
Комитет C89 отклонил расширение оператора
%
для работы с плавающими типами, поскольку такое использование дублировало бы возможности, предоставляемыеfmod
(см. §7.12.10.1).
И как позже обнаружил мафсо:
7.12.10.1 Функции fmod
[...]
Комитет C89 рассмотрел предложение использовать оператор остатка
%
для этой функции; но он был отклонен, потому что операторы в целом соответствуют аппаратным средствам, аfmod
не поддерживается аппаратно на большинстве машин.
Они кажутся несколько противоречивыми. Оператор %
не был расширен, потому что fmod
уже удовлетворил эту потребность, но fmod
был выбран для удовлетворения этой потребности, потому что комитет не хотел расширять оператор %
? Оба они не могут быть истинными одновременно.
Я подозреваю, что одна из этих причин была первоначальной, а другая была причиной того, что позже это решение не было пересмотрено, но неизвестно, какая из них была первой. В любом случае было просто решено, что %
не будет выполнять эту операцию.
%
для этой функции; но он был отклонен, потому что операторы в целом соответствуют аппаратным средствам, а fmod
не поддерживается аппаратно на большинстве машин».
- person mafso; 16.08.2014
fmod
и вместо этого определить оператор).
- person mafso; 16.08.2014
char
— целочисленный тип. Для типов с плавающей запятой используйтеfmod()
. - person Oliver Charlesworth   schedule 16.08.2014char
— это 8-битное целое число.double
не является целым числом. - person Hot Licks   schedule 16.08.2014char
– это минимум 8-битное целое число. Однако, поскольку можно легко определить операцию по модулю над нецелыми числами, это на самом деле не отвечает на вопрос. (На вопрос в стиле «почему» единственный ответ, вероятно, состоит в том, что именно так его определяет стандарт C.) - person The Paramagnetic Croissant   schedule 16.08.2014%
работал и с типами с плавающей запятой.) - person The Paramagnetic Croissant   schedule 16.08.2014%
для целых чисел определяется в терминах/
; это равенство не обязательно выполняется в арифметике с плавающей запятой. - person Oliver Charlesworth   schedule 16.08.2014*
и/
определены как для целочисленных типов, так и для типов с плавающей запятой, хотя они также не делают одно и то же (такие тождества, какa * b / b == a
, сохраняются для целых чисел, но не для типов FP). Так почему же нельзя было определить и%
? Зная о неточном характере арифметики с плавающей запятой, можно было бы ожидать, чтоa / b * b + a % b != a
. (Кроме того, поскольку целые числа и числа с плавающей запятой являются разными типами, нет проблем с определением определенной операции для них немного по-разному.) - person The Paramagnetic Croissant   schedule 16.08.2014%
похоже, его лучше называть оператором остатка, а не модулем; то, что спецификация C называет это. Бен хорошо рассказал о различиях. - person chux - Reinstate Monica   schedule 16.08.2014