Приведенный выше код выдает ошибку, поскольку понятно, что ...
Этот код не гарантирует "выбросить ошибку". Скорее, поведение не определено. Бросок ошибки - одно из возможных действий. Если он выдаст ошибку, вы можете считать себя счастливчиком, так как в противном случае было бы трудно найти вашу ошибку.
... так как понятно, что p.end () указывает на нулевой указатель.
Нет, p.end()
не "указывает на нулевой указатель". Он указывает на конец вектора, где конец вектора определяется как позиция после последнего элемента.
Пока этот код работает нормально и выводится 30 60. Кто-нибудь может это объяснить?
«Работает нормально» и «вывод составляет 30 60» - возможные варианты поведения, когда поведение не определено. Все это возможное поведение, когда оно не определено. Но, конечно, нет никаких гарантий, что он будет работать нормально. Что касается языка, то завтра программа может не сработать.
Я проверил это на многих онлайн-компиляторах, но вывод такой же !!
Ouput быть одинаковым на многих онлайн-компиляторах также возможно поведение, когда поведение не определено. Нет гарантии, что какой-то компилятор будет вести себя по-другому, так же, как нет гарантии, что он будет вести себя одинаково.
Независимо от того, сколько компиляторов вы пробуете, невозможно проверить правильность программы, просто выполнив ее и наблюдая результат, на который вы рассчитывали. Единственный способ доказать правильность программы - это проверить все предварительные условия и наложенные на программу инварианты.