If a parameter has a default value, it will be passed to the function if a particular call doesn't specify a value for that parameter. If a parameter has a default, all parameters after it must have a default. If you omit a parameter in a call, you must omit all parameters after it.
These latter two rules come about because parameters are strictly positional. The names you give the parameters in the declaration are ignored, and the names in the definition only create local variables to hold the values pass by the caller. Any variable names you use when calling the function pertain only to the code where the function is called. There is no correlation between function call variable names and function declaration/definition parameter names.
Code:
[B]// foo.c[/B]
bool isFive(int x) { ... }
...
[B]// bar.c[/B]
int x = ...
if (isFive(x)) { ... }
The two "x" variables here are completely unrelated. When isFive() is called, whatever value the x in foo.c has is passed into isFive() and gets stored in a new local variable called x (coincidentally) in the isFive() function. You should read up on variable scoping rules in C/C++ as their very important to understanding code.
A good rule of thumb is that most of the variables you see in functions do not exist outside those functions. This is called "local" scope as they are local to the function.