Путаница с приоритетом C-оператора - PullRequest
2 голосов
/ 24 ноября 2010
main()
{
  int a=3+2%5;
  printf("%d",a);
}

Программа возвращает значение 5, но как и почему?

Ответы [ 7 ]

5 голосов
/ 24 ноября 2010

Поскольку ваше арифметическое выражение анализируется как 3+(2%5).

См. Эту таблицу и обратите внимание, что% имеет более высокий приоритет, чем +.

1 голос
/ 24 ноября 2010

% имеет более высокое значение precedence, чем +, поэтому

3 + 2 % 5

эквивалентно

3 + ( 2 % 5 )

, что дает 5.

0 голосов
/ 24 ноября 2010

Оператор мода (%) имеет приоритет над оператором сложения, и поэтому сначала вычисляется «2% 5», в результате получается 2, а затем 3 + 2, в результате получается ваш ответ 5.

0 голосов
/ 24 ноября 2010

Модуль вычисляется с тем же приоритетом, что и умножение и деление.

2 % 5 = 2
2 + 3 = 5
0 голосов
/ 24 ноября 2010

Потому что это интерпретируется как 3 + (2 % 5). Когда вы делите 2 на 5, остаток равен 2, и добавление этого к 3 дает вам 5.

Причина интерпретируется таким образом в разделе 6.5.5 стандарта ISO C99 :

multiplicative-expression:
    cast-expression
    multiplicative-expression * cast-expression
    multiplicative-expression / cast-expression
    multiplicative-expression % cast-expression

Другими словами, % обрабатывается так же, как * и /, и поэтому имеет более высокий приоритет оператора, чем + и -.

0 голосов
/ 24 ноября 2010

Все просто, «%» связывает больше, чем «+».

3+2%5

семантически эквивалентно

3+(2%5)

что, очевидно, 5

0 голосов
/ 24 ноября 2010

Ваш код эквивалентен:

main() { 
    int a = 3 + (2 % 5); 
    printf("%d",a); 
}

См. Таблица приоритетов операторов .

2 % 5 (= 2) оценивается первой, затем следует 3 + 2 отсюда и ответ 5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...