2016-04-09 3 views
2

Рассмотрим следующий код:Является ли `(T *) 0 - (T *) 0` корректным для 0?

#include <iostream> 

int main() 
{ 
    int *a = 0, *b = 0; 
    std::cout << (a - b); 
} 

На ideone этот код печатает 0, как и следовало ожидать, но я не уверен, если это хорошо определено поведение или нет.

Интересно, хорошо ли определено (T*)0 - (T*)0? Гарантировано, что оно равно 0?
Это то же самое на C и C++? Если нет, то каковы различия?

(Конечно, T не void ни std::nullptr_t, потому что арифметика указателей не работает для них.)

+0

Более старый вопрос явно ограничен старыми версиями C и C++. Этот вопрос привлекал ответы на более современные версии, поэтому я голосую за возобновление. –

+2

@AdrianMcCarthy Не уверен, что я следую. Хотя он был помечен более старыми версиями в дополнение к общим тегам C++/c, верхний проголосовавший ответ цитирует то, что похоже на тот же источник, что и единственный ответ на этот вопрос для версий стандарта C++ 03 и C++ 11 – Foon

ответ

6

В C++, см [expr.add]/7:

Если два указателя [...] как нулевые , и два указателя равны вычитаются, результат сравнивается с значением 0, преобразованным в тип std::ptrdiff_t.

(Это также имеет место с P0137, что сокращает этот пункт.)

В C11, поведение, по-видимому не определен согласно 6.5.6/9:

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

+1

Ссылка на сайт кеша google, поскольку open-std.org, похоже, имеет проблемы с сервером. – Columbo

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