Нет ничего плохого в (jigar)(a);
, поскольку это допустимо в стандарте C. Причина, по которой ваш компилятор MIPS выдает предупреждение, заключается в том, что, возможно, этот компилятор не полностью реализует стандарт C.
Редактировать: Относительно запроса Алса, почему это стандартный C, вот как:
Посмотрите на грамматику ISO C здесь: http://www.cs.dartmouth.edu/~mckeeman/cs48/mxcom/doc/notation/c.html и обратите внимание, что вызов функции
postfix-expression -> postfix-expression ( )
| postfix-expression ( argument-expression-list )
может иметь postfix-expression
в качестве функции. Существует правило, которое гласит:
postfix-expression -> primary-expression
где primary-expression
может быть identifier
, то есть именем функции. Однако есть и это правило:
primary-expression -> ( expression )
и если вы будете следовать цепочке правил с expression
, вы снова вернетесь к primary-expression
. Следовательно, косвенно, у вас есть:
primary-expression -> ... -> ( primary-expression ) -> ( identifier )
Семантика C указывает, что ( expression )
имеет тот же тип и значение, что и expression
(1). Согласно грамматике, (jigar) (а) является правильным. Семантически (jigar)
и jigar
имеют одинаковый тип и значение. Поэтому C принимает (jigar)(a)
, а функциональность такая же, как jigar(a)
.
Редактировать 2:
(1) Проект раздела C99 6.5.1, статья 5:
Заключенное в скобки выражение является основным выражением. Его тип и значение идентичны типам выражения без скобок . Это lvalue, обозначение функции или пустое выражение , если не заключенное в скобки выражение равно , соответственно lvalue, обозначение функции или пустое выражение.
P.S. Кто-нибудь знает, где я могу получить документацию для ISO C, как список функций или что-то? Я видел, как люди цитировали это, но я не мог найти это сам.