История изменений
Исправление lovesan, (текущая версия) :
Очевидно это дает понимание что код не будет работать, как задумывал программист считающий что указатель это число.
Че?
На компилятор это не влияет, он следует стандарту С, внутренняя реализация это не то что я обсуждаю.
Если ты пишешь на Си без понимания системы под которую ты пишешь, и считаешь что Си дофига высокоуровневый - тебе надо на питоне писать, вместо этого, а до Си не допускать вообще. Потому что он уместен только как раз в тех местах, где нужен низкоуровневый системно-специфичный дроч - ОС, драйвера, рантаймы ЯП, работа с микроконтроллерами, и все в таком духе. И во всех этих случаях тебе стандарт сам по себе во-первых, особо нахер не уперся, а во-вторых, руководствуясь только им - ты никуда не уедешь.
Касательно кода, который тут высрат.
Ты сам то понимаешь что тут происходит? Опять же, как и в примере выше - это вообще не относится к тому, что указатель это число.
У тебя компилятор первую проверку тупо выкидывает нахрен. А знаешь почему?
А потому что попробуй это скомпилировать с -O0
То что происходит у тебя в коде, на x86-64, это конкретные приколы оптимизатора GCC.
С -O0 у тебя не выведется ни A и B, и видимо, рассчитывая на это, компилятор тебе и удаляет первую проверку. Зато, если с -O0 сделать *pb = &b - 1;
, вместо «плюс один» - выведет обе буквы. Более того, с минусом - будет работать и в майрософтовском VC++. За Clang не знаю.
Начнем с того, что тебе вообще никто не гарантирует, в каком порядке у тебя переменные распиханы по памяти, как и в придурочном примере с выходом за границы массива на стеке выше. И никакие «абстракции Си», в которых якобы указатель это не число - тут не при чем.
P.S. Если немного модифицировать твой говнокод, вот таким образом, то выведется тебе обе буквы даже с -O2:
static int a, b;
void foo(int* pa, int* pb) {
if (pa == pb) {
printf("A\n");
}
if ((long)pa == (long)pb) {
printf("B\n");
}
}
int main() {
int *pa = &a, *pb = &b + 1;
foo(pa, pb);
return 0;
}
Исходная версия lovesan, :
Очевидно это дает понимание что код не будет работать, как задумывал программист считающий что указатель это число.
Че?
На компилятор это не влияет, он следует стандарту С, внутренняя реализация это не то что я обсуждаю.
Если ты пишешь на Си без понимания системы под которую ты пишешь, и считаешь что Си дофига высокоуровневый - тебе надо на питоне писать, вместо этого, а до Си не допускать вообще. Потому что он уместен только как раз в тех местах, где нужен низкоуровневый системно-специфичный дроч - ОС, драйвера, рантаймы ЯП, работа с микроконтроллерами, и все в таком духе. И во всех этих случаях тебе стандарт сам по себе во-первых, особо нахер не уперся, а во-вторых, руководствуясь только им - ты никуда не уедешь.
Касательно кода, который тут высрат.
Ты сам то понимаешь что тут происходит? Опять же, как и в примере выше - это вообще не относится к тому, что указатель это число.
У тебя компилятор первую проверку тупо выкидывает нахрен. А знаешь почему?
А потому что попробуй это скомпилировать с -O0
То что происходит у тебя в коде, на x86-64, это конкретные приколы оптимизатора GCC.
С -O0 у тебя не выведется ни A и B, и видимо, рассчитывая на это, компилятор тебе и удаляет первую проверку. Зато, если с -O0 сделать *pb = &b - 1;
, вместо «плюс один» - выведет обе буквы. Более того, с минусом - будет работать и в майрософтовском VC++. За Clang не знаю.
Начнем с того, что тебе вообще никто не гарантирует, в каком порядке у тебя переменные распиханы по памяти, как и в придурочном примере с выходом за границы массива на стеке выше. И никакие «абстракции Си», в которых якобы указатель это не число - тут не при чем.