2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Знаете ли Вы C++?
Сообщение29.11.2013, 14:44 
Заслуженный участник


28/04/09
1933
Скомпилируется ли следующий код на C++ (компилятором, полностью соответствующем стандарту C++03)?
  • Если да, то что будет выведено на печать? Приведите варианты схожих конструкций, которые не должны компилироваться.
  • Если нет, то в каких строках находятся ошибки? Что будет выведено, если закомментировать места с ошибками?
Обоснуйте ответ.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>

struct T
{

    T()
    {
        std::cout << "T::T() ";
    }

    T(const T&)
    {
        std::cout << "T::T(const T&) ";
    }

};

void PrintIndex()
{
    static int index = 0;
   
    std::cout << std::endl << ++index << ": ";
}

int main()
{
    PrintIndex(); { T();        }  //  1
    PrintIndex(); { T t;        }  //  2
    PrintIndex(); { T T;        }  //  3
    PrintIndex(); { T(t);       }  //  4 (добавляем скобки)
    PrintIndex(); { T(T);       }  //  5
    PrintIndex(); { T(*);       }  //  6 (начинаем эксперименты со звездочкой)
    PrintIndex(); { T t();      }  //  7
    PrintIndex(); { T T();      }  //  8
    PrintIndex(); { T(t)();     }  //  9
    PrintIndex(); { T(T)();     }  // 10
    PrintIndex(); { T(*)();     }  // 11
    PrintIndex(); { T(t());     }  // 12
    PrintIndex(); { T(T());     }  // 13
    PrintIndex(); { T(*());     }  // 14
    PrintIndex(); { T((t)());   }  // 15
    PrintIndex(); { T((T)());   }  // 16
    PrintIndex(); { T((*)());   }  // 17
    PrintIndex(); { T t(T);     }  // 18
    PrintIndex(); { T T(T);     }  // 19
    PrintIndex(); { T *(T);     }  // 20
    PrintIndex(); { T *(t);     }  // 21
    PrintIndex(); { T(t)(T);    }  // 22
    PrintIndex(); { T(T)(T);    }  // 23
    PrintIndex(); { T(*)(T);    }  // 24
    PrintIndex(); { T t(T());   }  // 25
    PrintIndex(); { T T(T());   }  // 26
    PrintIndex(); { T *(T());   }  // 27
    PrintIndex(); { T *(t());   }  // 28
    PrintIndex(); { T(t)(T());  }  // 29
    PrintIndex(); { T(T)(T());  }  // 30
    PrintIndex(); { T(*)(T());  }  // 31
    PrintIndex(); { T(t)(T(T)); }  // 32
    PrintIndex(); { T(T)(T(T)); }  // 33
    PrintIndex(); { T(*)(T(T)); }  // 34
    PrintIndex(); { T(*)()();   }  // 35 (и еще немного скобочек напоследок)
    PrintIndex(); { T(*)(T)();  }  // 36
    PrintIndex(); { T(*)()(T);  }  // 37
    PrintIndex(); { T(*)(T)(T); }  // 38
    PrintIndex(); { T(*)()()(); }  // 39 (пожалуй, на этом стоит остановиться)
    PrintIndex(); { T(*)(T(*)); }  // 40 (последний пример со звездочками)
    PrintIndex(); { T t=T();    }  // 41 (опробуем знак "равно" на закуску)
    PrintIndex(); { T(t)=T();   }  // 42 (ответ на главный вопрос найден)
}
P.S. Приветствуются отзывы разнообразных реальных компиляторов о коде.
P.P.S. Некоторые правильные с точки зрения языка конструкции на этапах 1-31 я пропустил. Несколько пропусков были сделаны осознанно, а какие-то варианты я просто забыл. Прошу не проходить мимо всех замеченных Вами лакун, а сигнализировать о них в теме.

 Профиль  
                  
 
 Re: Знаете ли Вы C++?
Сообщение29.11.2013, 17:06 
Заслуженный участник


23/07/08
10626
Crna Gora
Наверное, Вас не очень интересует такой старый компилятор, как в Borland C++ Builder 6.0 (2002 год), но всё-таки отчитаюсь.

Варианты 6,11,14,17,24,31,34-40 вызывают ошибку 2188 Expression syntax.
Вариант 27 вызывает ошибку 2356 Type mismatch in redeclaration of 'T()'
Вариант 28 вызывает ошибку 2356 Type mismatch in redeclaration of 't()'
После комментирования всех ошибочных операторов и запуска программы варианты 1-5, 41-42 выдали
T::T()
Остальные (оставшиеся после комментирования) промолчали.

Выходит, копирующий конструктор нигде не был вызван. При этом Code Optimization = None.

 Профиль  
                  
 
 Re: Знаете ли Вы C++?
Сообщение29.11.2013, 18:20 
Аватара пользователя


07/01/13
261
NJ
MSVS 2010, закомментированы строки с ошибками плюс сам текст ошибки:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include "stdafx.h"
#include <iostream>

struct T
{

        T()
        {
                std::cout << "T::T() ";
        }

        T(const T&)
        {
                std::cout << "T::T(const T&) ";
        }

};

void PrintIndex()
{
        static int index = 0;

        std::cout << std::endl << ++index << ": ";
}


int _tmain(int argc, _TCHAR* argv[])
{
        PrintIndex(); { T();        }  //  1
        PrintIndex(); { T t;        }  //  2
        PrintIndex(); { T T;        }  //  3
        PrintIndex(); { T(t);       }  //  4 (добавляем скобки)
        PrintIndex(); { T(T);       }  //  5
        PrintIndex(); //{ T(*);       }  //  6 (начинаем эксперименты со звездочкой)   error C2059: syntax error : ')'
        PrintIndex(); { T t();      }  //  7
        PrintIndex(); { T T();      }  //  8
        PrintIndex(); { T(t)();     }  //  9
        PrintIndex(); { T(T)();     }  // 10
        PrintIndex(); //{ T(*)();     }  // 11                                         error C2059: syntax error : ')'
        PrintIndex(); { T(t());     }  // 12
        PrintIndex(); { T(T());     }  // 13
        PrintIndex(); //{ T(*());     }  // 14                                         error C2059: syntax error : ')'
        PrintIndex(); { T((t)());   }  // 15
        PrintIndex(); { T((T)());   }  // 16
        PrintIndex(); //{ T((*)());   }  // 17                                         error C2059: syntax error : ')'
        PrintIndex(); { T t(T);     }  // 18
        PrintIndex(); { T T(T);     }  // 19
        PrintIndex(); //{ T *(T);     }  // 20                                         error C2226: syntax error : unexpected type 'T'
        PrintIndex(); { T *(t);     }  // 21
        PrintIndex(); { T(t)(T);    }  // 22
        PrintIndex(); { T(T)(T);    }  // 23
        PrintIndex(); //{ T(*)(T);    }  // 24                                          error C2059: syntax error : ')'
        PrintIndex(); { T t(T());   }  // 25
        PrintIndex(); { T T(T());   }  // 26
        PrintIndex(); //{ T *(T());   }  // 27                                         error C2226: syntax error : unexpected type 'T'
        PrintIndex(); { T *(t());   }  // 28
        PrintIndex(); { T(t)(T());  }  // 29
        PrintIndex(); { T(T)(T());  }  // 30
        PrintIndex(); //{ T(*)(T());  }  // 31                                          error C2059: syntax error : ')'
        PrintIndex(); { T(t)(T(T)); }  // 32
        PrintIndex(); { T(T)(T(T)); }  // 33
        PrintIndex(); //{ T(*)(T(T)); }  // 34                                            error C2059: syntax error : ')'
        PrintIndex(); //{ T(*)()();   }  // 35 (и еще немного скобочек напоследок)        error C2059: syntax error : ')'
        PrintIndex(); //{ T(*)(T)();  }  // 36                                            error C2059: syntax error : ')'
        PrintIndex(); //{ T(*)()(T);  }  // 37                                            error C2059: syntax error : ')'
        PrintIndex(); //{ T(*)(T)(T); }  // 38                                            error C2059: syntax error : ')'
        PrintIndex(); //{ T(*)()()(); }  // 39 (пожалуй, на этом стоит остановиться)      error C2059: syntax error : ')'
        PrintIndex(); //{ T(*)(T(*)); }  // 40 (последний пример со звездочками)          error C2059: syntax error : ')'
        PrintIndex(); { T t=T();    }  // 41 (опробуем знак "равно" на закуску)
        PrintIndex(); { T(t)=T();   }  // 42 (ответ на главный вопрос найден)

        return 0;
}
 


Вывод предупреждений компилятора (все виды оптимизации отключены):
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
1>consoleapplication1.cpp(41): warning C4930: 'T t(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(42): warning C4930: 'T T(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(43): warning C4930: 'T t(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(44): warning C4930: 'T T(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(46): warning C4930: 'T t(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(47): warning C4930: 'T T(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(49): warning C4930: 'T t(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(50): warning C4930: 'T T(void)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(52): warning C4930: 'T t(T)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(53): warning C4930: 'T T(T)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(55): warning C4101: 't' : unreferenced local variable
1>consoleapplication1.cpp(56): warning C4930: 'T t(T)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(57): warning C4930: 'T T(T)': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(59): warning C4930: 'T t(T (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(60): warning C4930: 'T T(T (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(63): warning C4930: 'T t(T (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(64): warning C4930: 'T T(T (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(66): warning C4930: 'T t(T (__cdecl *)(T))': prototyped function not called (was a variable definition intended?)
1>consoleapplication1.cpp(67): warning C4930: 'T T(T (__cdecl *)(T))': prototyped function not called (was a variable definition intended?)
 


Вывод приложения:

код: [ скачать ] [ спрятать ]
Используется синтаксис Text
1: T::T()
2: T::T()
3: T::T()
4: T::T()
5: T::T()
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41: T::T()
42: T::T()
 

 Профиль  
                  
 
 Re: Знаете ли Вы C++?
Сообщение01.12.2013, 13:59 
Заслуженный участник


28/04/09
1933
svv в сообщении #794255 писал(а):
Выходит, копирующий конструктор нигде не был вызван.
Можете объяснить подобное поведение?
svv в сообщении #794255 писал(а):
При этом Code Optimization = None.
Corund в сообщении #794269 писал(а):
все виды оптимизации отключены
Да, про оптимизацию я забыл сказать. Хорошо, что вы ее отключили.
Corund в сообщении #794269 писал(а):
Вывод предупреждений компилятора
VC++ своими предупреждениями сильно проясняет ситуацию. :-(

Ситуацию с тем, что скомпилировалось, а что $\text{---}$ нет, пока комментировать не буду.

Давайте все-таки начнем разбираться. В первую очередь рассмотрим наиболее простые случаи:
  • Что написано в строке 3?
  • Чем строка 7 отличается от 2?
  • Что означает запись в строке 4?

 Профиль  
                  
 
 Re: Знаете ли Вы C++?
Сообщение02.12.2013, 14:49 
Заслуженный участник


23/07/08
10626
Crna Gora

(Оффтоп)

Я не силен в тонкостях. Я выбрал для себя некоторое подмножество языка, которое я понимаю, и только его и использую (ООП, шаблоны, исключения, по возможности в простых вариантах). Любой «спорный» вариант пытаюсь заменить более ясным, хотя бы и в ущерб эффективности.

Мне нравятся строгие, «академические» языки программирования, в то же время Pascal/Delphi для меня недостаточно мощный.

Поэтому, когда я смотрю на то, что написано в строке 3:
T T;
я удивляюсь, почему такое не запрещено.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group