Is there any common-ish use case for the comma operator? It seems like it would allow typo'd code to compile more often than actually doing anything useful. Ps
| This article is rated B-class on Wikipedia's content assessment scale. It is of interest to the following WikiProjects: | |||||||||||
| |||||||||||
Is there any common-ish use case for the comma operator? It seems like it would allow typo'd code to compile more often than actually doing anything useful. Psychlohexane (talk) 18:51, 11 April 2012 (UTC)
for (i = 0; i < 10; j++, i++) (head code), where a normal C statement would not be permitted. I'm not sure whether this is either particularly common or regarded as good practice. 82.113.148.68 (talk) 13:20, 28 May 2012 (UTC)if (badThing) return (errno = EINVAL, -1); -- here the side-effect of assigning to the global errno and the return code (-1) indicating an error occurred (and the caller should check errno). 75.162.33.157 (talk) 18:18, 11 August 2012 (UTC)Thanks for the good question and responses! The main use case, as noted, is in the initializer and increment of for loops, though there are a few other uses. I’ve written them up in Comma operator#Uses, in edits ending in this edit. Hope these help, and please edit!
I came across another usage yesterday. You can use the operator to check, if a specific function can be called with the current compiler or not, if yes call it, otherwise call a fallback. Usefull for crossplatform development. http://stackoverflow.com/questions/1386183/how-to-call-a-templated-function-if-it-exists-and-something-else-otherwise — Preceding unsigned comment added by Uwe Gebhardt (talk • contribs) 12:22, 4 January 2013 (UTC)
This article needs to mention that Stroustrup's comment about the usefulness of operator-comma was probably meant to indicate that it's not very useful to redefine or overload this operator, as opposed to merely using it. The problem is that redefining the operator results in destroying the operator precedence and the evaluation order!
For example, if I were to write something like:
a = b.foo(), c.bar();
then it is normally guaranteed that foo() will be called first, its result thrown away, then bar() called second, and its result assigned to "a".
NOT So if you've overloaded the comma operator! Now it is simply a function call, and the C++ compiler is entirely within its rights (according to the language definition) to evaluate its arguments in either order it prefers.
FWIW, beside their use in for-loops, I have found the comma operator useful for both horizontal and vertical brevity in switch statements, for example in a simple character-by-character state machine:
while (state) switch ((c = *src++), state) {
case 1:
if (c == 'x') ...
...
case 9:
if (c == 'y') ...
...
state = 0; /* exit sm */
}
Instead of:
while (state) {
c = *src++;
switch (state) {
case 1:
if (c == 'x') ...
...
case 9:
if (c == 'y') ...
...
state = 0; /* exit sm */
}
}
without any significant loss of clarity. 173.23.44.8 (talk) 19:17, 22 May 2018 (UTC)
In the examples there is a problem in the fifth line: The result of "i = a += 2" is not defined by the C standard. The C compiler can decide to compile the statements composing the whole in the following way:
t1 = a+2 a = t1 i = a
where "t1" is some temporary storage, but could also shuffle the second and third lines like this
t1 = a+2 i = a a = t1
since there is only a sequence point after the "2". The original author of the examples seems to have intended the second way, gcc on my computer chooses the first. As this is undefined by the C standard I would remove that example. 134.169.77.186 (talk) 10:26, 26 July 2012 (UTC) (ezander)
WRT "In this example, the differing behavior between the second and third lines..." The second and third lines are comments. ... In general, it's best to describe example code without using comments. Comments are for programmers. WP is for a wider audience. Also, with description in the prose, I think this sort of issue would be less likely. Stevebroshar (talk) 20:29, 27 January 2025 (UTC)
WRT "The most common use is to allow multiple assignment statements without using a block statement"
Seems debatable that that's the _most_ common.
Also, this is not a great example of the operator since a core aspect is evaluating to the second operand, but the evaluated value of the first part of a loop spec is not used. The second part is used. A better example, would use the comma in the second part. Stevebroshar (talk) 20:34, 27 January 2025 (UTC)
WRT "This is the only idiomatic use in elementary C programming"
What does elementary C programming imply? Means little to me. If it means intro programming classes then I have to ask: according to who? Stevebroshar (talk) 20:37, 27 January 2025 (UTC)
WRT "the comma might be used instead of a semicolon, particularly when the statements in question function similarly to a loop increment (e.g. at the end of a while loop): ++p, ++q; ++p; ++q;"
What is the significance of: the statements in question function similarly to a loop increment. It begs the question: so what? It seems one can use comma instead of semi in alot of situations. What makes this one special? Stevebroshar (talk) 20:40, 27 January 2025 (UTC)
WRT "is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type)"
I don't think "returns this value" is accurate. Return implies a function, but there is no function. And type never gets returned. How about: Two expressions separated by the comma operator evaluate to the value of the second expression. Stevebroshar (talk) 20:47, 27 January 2025 (UTC)
* Results: a=1, b=2, c=3, i=1
*/
int a=1, b=2, c=3;
{ int i = a, b; }
That's only if you decide to consider the result within the braces; outside the braces (i.e. the end) it is undefined, right?
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.