我写了一个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));
}
答案 0 :(得分:8)
您没有传递两个参数-即reverse(i++, i)
(由于(i++
和i
之间缺少序列点,偶然会调用未定义的行为)。< / p>
您将(i++, i)
作为单个参数传递。由于它在另一对括号内,因此这里的逗号不会分隔函数的参数,而是充当逗号运算符。
答案 1 :(得分:5)
(i++, i)
似乎执行了i++
,然后求值为i
,最后一个操作数是,
。您可以在这里看到它:
// Notice the ( , )
int i = (puts("Inside\n"), 2); // Prints "Inside"
printf("%d\n", i); // Prints 2
它没有引起错误,因为您仅传递了一个参数。尽管有一个参数是一系列影响,估计为i
。