|It's interesting that you mention "assembly".
The very history of C as a programming language speaks loudly.
Long ago and long ago (as the Native Americans would say), Bell Laboratories purchased a DEC PDP-7 computer. That machine was quite primitive, more or less a "minimal" computer. It had either 4k or 8k memory of 18 bit words, 16 op-codes, no multiply or divide instructions, no index registers, and primitive indirect addressing. It did have a set of memory locations that were "auto-increment" that simulated very primitive index registers, but were not terribly useful over all.
The principle I/O were paper tape and a model 33 teletype. In fact, a bare-bones PDP-7 only had a teletype, in which case it would have been a model 35 ASR, which had paper tape read and write included. VERY slow!
Bell Labs wrote a language called BPL (for Bell Programming Language, I think) which they used as an alternative to the assembly language supplied by DEC. I've never seen any details on BPL. However, Bell Labs used BPL to write a FORTRAN compiler for the PDP-7, as odd at that might sound.
When DEC came out with the PDP-11, Bell Labs bought one and jumped on it like a duck on a June bug! They wrote a translator that converted the BPL translator (probably other programs as well) to run on the PDP-11. Using the translated BPL, they developed a new language, C.
From rags to riches in terms of machine language capability, the C designers included features in the language to utilize many of the newly available features of the PDP-11. In particular, the auto-increment/decrement and to-memory instruction modifiers were incorporated in the ++/--/+=/-= operators. The indirection modifiers gave rise to the pointer operators.
The above information I learned from a Bell Labs programmer/developer at at DECUS (Digital Equipment Computer User's Society) meeting. He was one of the original creators of C, but unfortunately I forget his name.
He told me that when they developed C, they had in mind a "portable assembler" that would allow them to port code to any architecture by merely writing a translator for C for that new machine. Good C programmers, he said, visualized assembly code as they wrote in C.
For anyone interested, here is a link to the PDP-11 "card":
Given the .NET availability these days, it makes a lot of sense to do MOST programming in a .NET style language, as the languages/compilers are tailored for cross-platform operation.
For most of us, performance penalties are minimal in light of the super-fast multi-core processors we now enjoy. Only a few developers who are involved with projects in which the "utmost farthing" of performance is demanded need to be concerned about the very low-level workings of a given processor. In this case, the original C, with a suitable translation to the target precessor, makes some sense.
For beginners, I believe that Small Basic offers a good compromise, as it introduces the use of "objects" despite not being able to create new classes. Its absence of complexity lets one teach about the principals of programming without becoming embroiled with side-bar issues that have little to do with learning what programming is all about. Beginners quickly learn the fundamentals, then are ready to move on. My choice is then C#, as it is a new generation language and can be taught in "layers" after a few "rules" are learned, and new "rules" can be added as needed.
One of my "heroes" once wrote:
"A computer is like an old-testament god, many rules and no mercy."
- Joseph Campbell