2013-05-22 2 views
4

Я написал экзамен по программированию на С ++. Был один вопрос, на который я и мой профессор не согласились. Вопрос был, выполняет следующие функции работы или нет:вызов функции с параметром по умолчанию

#include <iostream> 
using namespace std; 

void f(int=4, long=10, double=3.14); 

int main(int argc , char ** argv) 
{ 
    f(, ,8); 
     return EXIT_SUCCESS; 
} 

void f(int i, long l, double d) { 
    cout << i << " " << " " << l << " " << d; 
} 

Я сказал, что это не будет работать, но мой профессор сказал, что это, безусловно, работать из-за параметра по умолчанию в объявлении функции. Я попробовал это с MSVC, и это не сработало. Является ли это специфичным для компилятора? Как я могу убедить своего профессора, что он не работает ни в одном компиляторе, чтобы поднять мою оценку в экзамене?

ответ

6

Для начала, вы правы, профессор ошибается. И тот факт, что он утверждает, что это должно работать (когда тривиально показать, что это не так) означает, что он, вероятно, не должен преподавать C++. Но как его показать?

Просто попробуйте скомпилировать его, по крайней мере, с двумя разными компиляторами. Если оба не скомпилируют его, тогда есть очень хороший шанс, что это неверный код. Это самый быстрый способ.

Если это не удается, укажите стандарт C++. Вот синтаксис для выражения вызова, как описан в [expr.post] p1 и следующая нетерминальная ссылка:

postfix-expression: 
    ... 
    postfix-expression (expression-list[opt]) 

expression-list: 
    initializer-list 

initializer-list: ([dcl.init]p1) 
    initializer-clause ...[opt] 
    initializer-list , initializer-clause ...[opt] 

initializer-clause: 
    assignment-expression 
    braced-init-list 

braced-init-list: 
    { initializer-list ,[opt] } 
    { } 

Я не буду перечислять присваивания-выражение, но обратите внимание, что выражение не может когда-либо быть ничем, должен быть хотя бы один токен.Это означает, что предложение initializer никогда не может быть ничем, и поэтому всегда должно быть что-то между запятыми в аргументах функции.

+1

+1, это также действительное объяснение. – syam

+0

Спасибо, теперь я в состоянии обеспечить идеальные контраргументы – tom1991te

1

Это даже не актуально C++ синтаксис.

+0

Почему нет? что еще не так в коде? – tom1991te

+1

@ tom1991te: Вы не можете сказать 'f (,, 8)'. Это не разрешено. –

+0

Да, я точно знаю, что это был мой вопрос :) Я знаю, что это неверно, но мой проф не знает, что: D – tom1991te

1

Возможно, это связано с тем, что он работает только с пропущенными параметрами, как указано msdn. Попробуйте вызвать функцию так:

f(); // should use all default values for arguments 
f(3); // should use 3 for the first, default for the last two 
f(2, 5); // uses 2 for first, 5 for second, default for last 
f(5, 6, 3.4); // does not use any default values 
4

Из Standard (курсив мой, обратите внимание, в частности, слово трейлинг):

8.3.6 аргументы по умолчанию [dcl.fct.default]

  1. Если в объявлении параметра указано предложение initializer, это условие инициализатора используется в качестве аргумента по умолчанию. Аргументы по умолчанию будут использоваться в вызовах, в которых отсутствуют конечные аргументы.

  2. [Пример: декларация

void point(int = 3, int = 4);

объявляет функцию, которая может быть вызвана с нулем, одной или двумя аргументами типа Int. Она может быть вызвана любым из следующих способов:

point(1,2); point(1); point(); 

Последние два вызова эквивалентны point(1,4) и point(3,4) соответственно.

- конец пример]

Наслаждайтесь получать очки обратно. ;)

+0

Благодарим вас за то, что пропустить только пронумерованные аргументы, звучит как хороший аргумент :) Я попытаюсь объяснить это ему на этом пути. – tom1991te

Смежные вопросы