... and if the condition isn't == 3, but, say > 3, then your "replace-it-by-copypasted literal" strategy and "switch-case" strategy both break. In programming, the right question to ask is not "can I just make this work, with these exact values"; no, it's "what is the correct general pattern of doing this". Let the compiler work out the optimizations, let the compiler internally "copypaste" the literal "3". You as a programmer - communicate the intent.
Syntax isn't important. The important thing is to recognize what the correct underlying action is, and describe it with the language. In English, this could be: "If you have more than five bananas, give me all of your bananas except two which you can keep."
You can't describe this with a huge switch-case lookup table containing all possible numbers of bananas, or gazillion if-elses, either. You need to detect the pattern of checking the number of bananas, and using variables and arithmetic. Here, assignments and comparisons are both needed, are different operations, and they can be combined with checking. Both in English, and in C. You can of course add limitations; in English you can say "no sentences longer than 5 words". In BASIC you can say, no assignments inside IF clauses. If you forbid it, and everybody knows it's forbidden, then the compiler can assume the intent and is right 100% of the time.
But is this a good limitation?
The example I gave is very typical in C codebases and the reason is simple: it communicates the right intent - store value and act based on that value -, it removes copypasting variable names or values.
Short-circuiting && and || are similar. If you just know the rules, they are powerful communication tools.
To really inexperienced programmers, these may feel like obfuscations and tricks or "hacks", I understand that. But the solution, really, is in learning, not in limiting the tools.
You can always dumb down the language, and you end up with BASIC. BASIC is Turing complete, meaning it can implement any program C can. But so is Brainfuck.
Too "basic" languages make programs appear longer, slower to write, slower to read, harder to understand. Higher-level languages require more initial learning (more syntax, more rules...), but then allows doing more complex, more advanced programs without wasting time working around the limitations. And quite frankly, C is, by modern standards, quite primitive. If you limit its power in any way, trying to make it "easier" for complete beginners, it becomes pretty much unusable.
We don't need more beginner-friendly languages. We need beginners who are ready to invest some time in learning. Mistakes are OK. Arrogance is the problem.
I'm thinking about the effort spent in school, learning the grammatical rules of German (aus bei mit nach seit von zu, durich für gegen ohne um) and Swedish, without much use for either language because we communicate in English anyway. Compared to that, languages like C or Python are orders of magnitude easier to learn, even if you learn the whole standard by heart! Seeing how important programming is in modern societies, I'm surprised people want completely effortless learning, but are ready to spend years and years in learning human languages, even just for fun.