Я написал программу на C, в которой я объявил функцию reverse(int i)
. Когда я компилирую и запускаю программу, она работает нормально, несмотря на передачу двух таких аргументов reverse((i++, i))
. Почему это не вызывает синтаксическую ошибку? reverse
ожидает один аргумент.
#include <stdio.h>
void reverse(int i);
int main()
{
reverse(1);
}
void reverse(int i)
{
if (i > 5)
return ;
printf("%d ", i);
return reverse((i++, i));
}
Передача n
аргументов функции, которая принимает k != n
аргументы, не является синтаксической ошибкой, это скорее ошибка типа (то есть семантическая ошибка).
Если ответ решил ваш вопрос, вы можете пометить его как ответ, нажав серую галочку слева от вопроса.
(i++, i)
, кажется, выполняет i++
, затем вычисляет i
, последний операнд ,
. Вы можете увидеть это здесь:
// Notice the ( , )
int i = (puts("Inside\n"), 2); // Prints "Inside"
printf("%d\n", i); // Prints 2
Это не вызвало ошибки, потому что вы передали только один аргумент. Однако этот единственный аргумент представлял собой последовательность эффектов, которая оценивалась как i
.
Вы не передаете два аргумента - это будет reverse(i++, i)
(что, кстати, вызовет неопределенное поведение из-за отсутствия точки последовательности между (i++
и i
).
Вы передаете (i++, i)
как один аргумент. Поскольку она находится внутри дополнительной пары круглых скобок, запятая здесь не разделяет аргументы функции, а действует как оператор запятой.
Я понял . Спасибо за ответ
(i++, i)
является параметром один.