Я написал в файле с расширением .cpp обычную программу, которая выводит "hello world". Но потом, в этом же файле я написал ту же самую программу, но на языке Си. И она заработало!
Компиляторы с++ совместимы по большей части с языком Си, поэтому компилируют и тот, и другой исходник, независимо от расширения. Сделано это, естественно, для совместимости, что собственно и является основной логикой упомянутых языков в данном контексте
Язык C++ изначально создавался как расширение, полностью совместимое c языком C. Так что C++ включает в себя весь язык C.
Сейчас между C и С++ есть небольшие отличия, вызванные тем, что стандарты C и С++ создают разные комитеты. Но эти различия некритичны и большую часть С-кода можно скормить компилятору C++, а большую часть C++-кода, использующего только C-подмножество языка, можно скормить компилятору C.
В данном случае (Hello World) разница разве что только в том что в С++ выводим свой "приветик" через cout << , а в СИ через printf (который есть и в С++)