Also, even in C and C++, they don't indicate branching. You can place a brace block anywhere you can place a normal statement. You might use them in C++ just to delimit the extent of a RAII object. In C89 you might use a block to delay defining a variable until closer to its use, because variables can only be defined at the start of its block (although that no longer applies in C99). Conversely, though it's usually bad practice, you can use if statements and loops with individual statements.
C++, when increment becomes excrement, decrement back to C.
Yes, but why?
explains why Smalltalk used the up arrow and left arrow for fairly reasonable punctuation for return and assignment.
Up arrow was replaced much later by caret and left arrow was sadly replaced by :=
Some computers going into the 80s, for example the Commodore 8-bit line starting with the PET and going through the Commodore 128, still had ↑ and ← for ^ and _.
At least that's how it always in American English, and ASCII. Apparently British English says more than [these] can be "brackets" and <these> were called "angle brackets" in the 1970s, but when did anyone in the computer industry ever start calling anything but {these} braces?
You already found the answer.
To me, all of ()[]{} (and depending on context <>) are “brackets” in the sense that they bracket whatever is between them. Then a brace is a single side of a bracket (ie. opening brace plus closing brace make a bracket).
So to distinguish between the different brackets/braces you use “round”, “square”, “curly” or “angled” respectively. And “round” is the default so you often skip specifying that.
That’s been the convention in programming and maths everywhere I’ve worked outside America (in English).
They are used, but they do not occur in linear text, but as a way to group multiple lines or in an ornamental/page structuring way.
To summarize from the article for { and }:
Modern digraphs:
<% , %>. This is only one that looks symmetric
Less-modern trigraphs: ??< , ??>
Unix v4 (in the teletype driver): \( , \)
PDP-11 B: *( , *)
PDP-7 B: $( , $)
In other micro software (Advanced MuMath for the TRS-80), I have seen: << , >> for [ , ]
(< , >) for { , }
Back in the 80's, the joke among new learners of C and Unix is that the designers must have had a very bad keyboard where typing each character was painful, because every keyword or command was so short and cryptic. This article suggests a different reason: on their 36-bit Honeywell 6070, "four characters fit into a word", so there was incentive to fit in 1 machine word.It also explains why they used the obscure characters {,},|, and ~ while never using the FAR more common # and @. In the Teletype driver, "#" is clear previous char, and "@" is clear current line. So unavailable for C. I will still curse the C designers to my dying day for picking * as the prefix operator for dereference pointer, when the more logical @ character was SITTING RIGHT THERE! On every keyboard! So now every newbie to C has to stop thinking "multiplication" when they see *.
And what’s worse, many other languages copied this decision without understanding why it was made and why it’s completely nonsensical for modern languages.
(They use @ for marking keywords)
> It is hard to shed prejudices about how code should look, even if learning to see clearly past convention is the only good reason to be a mathematician. I'm already quite sure how I will die: I'll read another article on Hacker News about a new programming language where I see nothing new, and I'll read that they included {}; to make C programmers comfortable. I'll have a massive stroke.