Менять null pointer constant — очень и очень сложно, так как очень многое в компиляторах завязано на то, что null pointer constant (который определяется как 0 любого целого типа, приведённый к указателю) имеет битовое значение 0 как указатель. Иначе, к сожалению, средствами языка никак. Но можно определить переменную и затем linker script'ом разместить её по нужному адресу.
if (!x) не observable. return observable. Поэтому if() не обязан вычисляться. return мы не можем увидеть, потому что для того, чтобы он выполнился, должен был произойти undefined behavior, а дальше может происходить что угодно.
Компилятор может делать всё, что хочет если это не меняет observable behavior. В строке (1) есть два варианта: или x не нулевой указатель и (2) не сработает, или x нулевой указатель и дальше можно хоть запускать форматирование диска.
Вы — студент и изучаете C++. Вам нужны все тёмные уголки C++. Школьники изучают «программирование», это как курс алгоритмов, но приходится ещё в нагрузку давать какой-то язык чтобы можно было на ЭВМ работать.
$ cat a.cpp
#include <iostream>
struct A { };
std::ostream operator<<(std::ostream& os, A a)
{
return os;
}
$ clang++ -c a.cpp
In file included from a.cpp:1:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iostream:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ostream:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ios:44:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_ios.h:472:
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_ios.tcc:178:25: error: base class 'std::ios_base' has private copy constructor
extern template class basic_ios<char>;
^
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ios_base.h:787:5: note: declared private here
ios_base(const ios_base&);
^
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:360:25: note: implicit default copy constructor for 'std::basic_ios<char>' first required here
extern template class basic_ostream<char>;
^
a.cpp:7:10: note: implicit default copy constructor for 'std::basic_ostream<char>' first required here
return os;
^
1 error generated.
Причём «base class 'std::ios_base' has private copy constructor» подсвечено ярким. Покажите ужасное сообщение вашего компилятора.
C или C++? Да вы шутите! В стандарте Си более 190 различных undefined behavior, и я более чем уверен что даже среди разработчиков компиляторов не все их могут на глаз распознать в коде (когда это возможно статически).
В российском варианте практическое ограничение было в том, что программа будет запущена также на десктопной машине. На MTL же памяти 64 Gb, поэтому можно считать что не ограничено.
3. Если yp = zp, то выражение *xp + *yp меняет значение после первой итерации и поэтому его нельзя вынести за цикл.
12. INT_MIN / -1 должно быть равно -INT_MIN, но это больше INT_MAX, поэтому получаем переполнение числа со знаком.
Но вопрос был в том, насколько ужасны диагностики в компиляторах. Насколько хуже в вашем?
> С другой стороны, может ли школьник разобраться в этой ошибке?
А зачем школьнику перегружать операторы?
Причём «base class 'std::ios_base' has private copy constructor» подсвечено ярким. Покажите ужасное сообщение вашего компилятора.