men()
{
goto pub;
pub:
return pissed;
}
women()
{
goto bathroom;
bathroom:
while (1) ;
}
Найдено на http://www.gnu.org/fun/jokes/declarations.html.
Разное о программировании на C++
men()
{
goto pub;
pub:
return pissed;
}
women()
{
goto bathroom;
bathroom:
while (1) ;
}
#include <iostream>
#include <cmath>
void foo(double x, double y)
{
if (std::cos(x) != std::cos(y)) {
std::cout << "Huh?!?\n"; // ← вы можете оказаться здесь, даже если x == y!!
}
}
int main()
{
foo(1.0, 1.0);
return 0;
}
Точность чисел не обязана здесь быть одинаковой для каждого вычисления косинуса. Если результат вычисления будет перемещён из кеша процессора в оперативную память, станет возможным обрезание значащих битов. Другими словами эту ситуацию можно описать на псевдо-ассемблере:
fp_load x //занять регистр для работы с числами с плавающей точкой значением переменной x call _cos //вызвать cos(double), используя тот же регистр для возврата результата fp_store tmp //обрезать результат и разместить его в локальной переменной tmp fp_load y //занять регистр для работы с числами с плавающей точкой значением переменной y call _cos //вызвать cos(double), используя тот же регистр для возврата результата fp_cmp tmp //сравнить неусечённый результат в регистре с усечённым значением в tmp
class Human {
void eat(Object o) {
throw new NotImplementedException();
}
}
class Man extends Human {
private Penis penis;
public void fuck(Woman w) {
w.onFucked(this,null);
}
}
class Woman extends Human {
private Vagina vagina;
public void onFucked(Object o, EventArgs e) {
Man m = (Man)o;
scream(); // Хорошая женщина должна переопределять это поведение.
}
}
interface IFuckable {
void onFucked(Object o, EventArgs e);
}class Woman extends Human implements IFuckable { // обратите внимание на ключевое слово "implements"
private Vagina vagina;
public void onFucked(Object o, EventArgs e) {
Man m = (Man)o;
scream();
}
}class Toy {}
class Doll extends Toy implements IFuckable {
public void onFucked(Object o, EventArgs e) {
keepSilent();
}
}class Man extends Human {
private Penis penis;
public void fuck(IFuckable fuckableObj) { // Обратите внимание, что fuckableObj не обязан быть женщиной
fuckableObj.onFucked(this,null);
}
}
ifstream (назовём его IN) и ofstream (назовём его OUT):#include <fstream>
std::ifstream IN("input.txt");
std::ofstream OUT("output.txt");Вот простейший способ сделать это абсолютно неправильно:OUT << IN;Для тех, кто ещё не догадался, почему это не работает, предлагаю создать простой текстовой файл input.txt со следующим предложением:
The quick brown fox jumped over the lazy dog.Соберите и запустите программу. Результат в output.txt вас определённо удивит.
basic_[io]stream отвечают за форматирование и ни за что иное. Реальным чтением, записью и хранением данных занимается семейство basic_streambuf. К счастью, существует operator<< (принимающий ostream и указатель на streambuf), чтобы помочь в ситуации простого копирования.streambuf, а не просто streambuf? Дело в том, что потоки [io]stream содержат указатели (или ссылки, в зависимости от реализации), а не сами буферы. Это позволяет реализовать полиморфическое поведение как для буферов, так и для самих потоков. Указатель легко получить с помощью метода rdbuf(). Поэтому простейшим способом копирования файла являетсяOUT << IN.rdbuf();Так что же происходит в случае OUT<<IN? UB, неопределённое поведение, поскольку для данных типов
operator<< не определён. Возможны реализации, в которых он определён, но даже в этом случае будут потеряны все пробельные символы и в итоге вы увидите фразу "Thequickbrownfox...". Если в реализации оператор не определён, то скорее всего IN будет преобразован в void*, и в выводе вы увидите шестнадцатеричное представление адреса. Некоторые компиляторы могут просто отказаться компилировать такой код.o*f*streams, поскольку у них в родительском классе определён operator<<.
std:list:size(). Сложность std:list:size() в реализации STL от SGI (используемой, например, в gcc), оценивается как O(n). Вот, что говорится об этом в пояснении SGI:ФунцияВыбранный путь не противоречит стандартуsize()классов list и slist отрабатывает за время, пропорциональное числу элементов в списке. Это преднамеренный компромисс. Единственный способ получить размер связанных списков — предоставлять специальное поле внутри контейнера. Это потребует дополнительного времени для обновления этого поля (так, например, это приведёт к тому, что операцияsplice()будет выполняться за линейное время), а также сделает контейнер больше. Многие алгоритмы для связных списков не требуют этого дополнительного поля (для алгоритмов, требующих его, возможно, выгоднее работать с контейнеромvector), а если необходимо сохранять размер списка, то пользователи в состоянии делать это сами.
size() «стоит» (should) отрабатывать за константное время, а «стоит» не есть то же самое, что «обязан» (shall). Согласно официальной терминологии стандартов ISO это подразумевает, что в данное реализации предполагается в случае, если нет видимых причин для отказа.if (L.size() == 0)
...if (L.empty())
...