Does the statement `int val = (++i > ++j) ? ++i : ++j;` invoke undefined behavior?2019 Community Moderator ElectionWhy are these constructs using pre and post-increment undefined behavior?sequence points in cWhy are these constructs using pre and post-increment undefined behavior?Undefined, unspecified and implementation-defined behaviorIn C is there any guarantee with code prior to undefined behavior?Is the behavior of i = post_increment_i() specified, unspecified, or undefined?Undefined behavior and sequence pointIs `a++ & f(a)` undefined or unspecified?Undefined behavior with: c = (b=a+2) - (a=1) ;Does the following chained assignment cause Undefined behavior?Does a[a[0]] = 1 produce undefined behavior?printf with consecutive function as argument, undefined behavior
Check this translation of Amores 1.3.26
Why did it take so long to abandon sail after steamships were demonstrated?
Why do Australian milk farmers need to protest supermarkets' milk price?
Have researchers managed to "reverse time"? If so, what does that mean for physics?
Should we release the security issues we found in our product as CVE or we can just update those on weekly release notes?
Can anyone tell me why this program fails?
Rejected in 4th interview round citing insufficient years of experience
Bastion server: use TCP forwarding VS placing private key on server
Replacing Windows 7 security updates with anti-virus?
Happy pi day, everyone!
How to simplify this time periods definition interface?
How to deal with a cynical class?
Variant calling without matched normal sample
Welcoming 2019 Pi day: How to draw the letter π?
What is Thermal Runaway Protection?
Is it true that real estate prices mainly go up?
Professor being mistaken for a grad student
Co-worker team leader wants to inject his friend's awful software into our development. What should I say to our common boss?
It's a yearly task, alright
Employee lack of ownership
Brexit - No Deal Rejection
Making a sword in the stone, in a medieval world without magic
PTIJ: is Mi Yodeya found in the Torah codes?
Why is a Java array index expression evaluated before checking if the array reference expression is null?
Does the statement `int val = (++i > ++j) ? ++i : ++j;` invoke undefined behavior?
2019 Community Moderator ElectionWhy are these constructs using pre and post-increment undefined behavior?sequence points in cWhy are these constructs using pre and post-increment undefined behavior?Undefined, unspecified and implementation-defined behaviorIn C is there any guarantee with code prior to undefined behavior?Is the behavior of i = post_increment_i() specified, unspecified, or undefined?Undefined behavior and sequence pointIs `a++ & f(a)` undefined or unspecified?Undefined behavior with: c = (b=a+2) - (a=1) ;Does the following chained assignment cause Undefined behavior?Does a[a[0]] = 1 produce undefined behavior?printf with consecutive function as argument, undefined behavior
Given the following program:
#include <stdio.h>
int main(void)
int i = 1, j = 2;
int val = (++i > ++j) ? ++i : ++j;
printf("%dn", val); // prints 4
return 0;
The initialization of val seems like it could be hiding some undefined behavior, but I don't see any point at which an object is either modified more than once or modified and used without a sequence point in between. Could someone
either correct or corroborate me on this?
c ternary-operator sequence-points
|
show 6 more comments
Given the following program:
#include <stdio.h>
int main(void)
int i = 1, j = 2;
int val = (++i > ++j) ? ++i : ++j;
printf("%dn", val); // prints 4
return 0;
The initialization of val seems like it could be hiding some undefined behavior, but I don't see any point at which an object is either modified more than once or modified and used without a sequence point in between. Could someone
either correct or corroborate me on this?
c ternary-operator sequence-points
It certainly invokes downvoting + VTC on stack overflow.
– SergeyA
1 hour ago
3
Is there a sequence point? Please see this answer which states there is one "Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated (6.5.15)."
– Weather Vane
1 hour ago
You got 4. What did you expect?
– Bob Jarvis
1 hour ago
2
@Jean-FrançoisFabre No, but it doesn't need to be. There's no need for a sequence point between two changes of two different variables.++i > ++iwould be UB though.
– sepp2k
1 hour ago
1
@dandan78 maybe a duplicate, but not of that canonical
– Jean-François Fabre
1 hour ago
|
show 6 more comments
Given the following program:
#include <stdio.h>
int main(void)
int i = 1, j = 2;
int val = (++i > ++j) ? ++i : ++j;
printf("%dn", val); // prints 4
return 0;
The initialization of val seems like it could be hiding some undefined behavior, but I don't see any point at which an object is either modified more than once or modified and used without a sequence point in between. Could someone
either correct or corroborate me on this?
c ternary-operator sequence-points
Given the following program:
#include <stdio.h>
int main(void)
int i = 1, j = 2;
int val = (++i > ++j) ? ++i : ++j;
printf("%dn", val); // prints 4
return 0;
The initialization of val seems like it could be hiding some undefined behavior, but I don't see any point at which an object is either modified more than once or modified and used without a sequence point in between. Could someone
either correct or corroborate me on this?
c ternary-operator sequence-points
c ternary-operator sequence-points
edited 24 mins ago
machine_1
2,47921232
2,47921232
asked 1 hour ago
max1000001max1000001
968
968
It certainly invokes downvoting + VTC on stack overflow.
– SergeyA
1 hour ago
3
Is there a sequence point? Please see this answer which states there is one "Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated (6.5.15)."
– Weather Vane
1 hour ago
You got 4. What did you expect?
– Bob Jarvis
1 hour ago
2
@Jean-FrançoisFabre No, but it doesn't need to be. There's no need for a sequence point between two changes of two different variables.++i > ++iwould be UB though.
– sepp2k
1 hour ago
1
@dandan78 maybe a duplicate, but not of that canonical
– Jean-François Fabre
1 hour ago
|
show 6 more comments
It certainly invokes downvoting + VTC on stack overflow.
– SergeyA
1 hour ago
3
Is there a sequence point? Please see this answer which states there is one "Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated (6.5.15)."
– Weather Vane
1 hour ago
You got 4. What did you expect?
– Bob Jarvis
1 hour ago
2
@Jean-FrançoisFabre No, but it doesn't need to be. There's no need for a sequence point between two changes of two different variables.++i > ++iwould be UB though.
– sepp2k
1 hour ago
1
@dandan78 maybe a duplicate, but not of that canonical
– Jean-François Fabre
1 hour ago
It certainly invokes downvoting + VTC on stack overflow.
– SergeyA
1 hour ago
It certainly invokes downvoting + VTC on stack overflow.
– SergeyA
1 hour ago
3
3
Is there a sequence point? Please see this answer which states there is one "Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated (6.5.15)."
– Weather Vane
1 hour ago
Is there a sequence point? Please see this answer which states there is one "Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated (6.5.15)."
– Weather Vane
1 hour ago
You got 4. What did you expect?
– Bob Jarvis
1 hour ago
You got 4. What did you expect?
– Bob Jarvis
1 hour ago
2
2
@Jean-FrançoisFabre No, but it doesn't need to be. There's no need for a sequence point between two changes of two different variables.
++i > ++i would be UB though.– sepp2k
1 hour ago
@Jean-FrançoisFabre No, but it doesn't need to be. There's no need for a sequence point between two changes of two different variables.
++i > ++i would be UB though.– sepp2k
1 hour ago
1
1
@dandan78 maybe a duplicate, but not of that canonical
– Jean-François Fabre
1 hour ago
@dandan78 maybe a duplicate, but not of that canonical
– Jean-François Fabre
1 hour ago
|
show 6 more comments
3 Answers
3
active
oldest
votes
The behavior of this code is well defined.
The first expression in a conditional is guaranteed to be evaluated before either the second expression or the third expression, and only one of the second or third will be evaluated. This is described in section 6.5.15p4 of the C standard:
The first operand is evaluated; there is a sequence point
between its evaluation and the evaluation of the second or third
operand (whichever is evaluated). The second operand is evaluated
only if the first compares unequal to 0; the third operand is
evaluated only if the first compares equal to 0; the result is
the value of the second or third operand (whichever is
evaluated), converted to the type described below.
In the case of your expression:
int val = (++i > ++j) ? ++i : ++j;
++i > ++j is evaluated first. The incremented values of i and j are used in the comparison, so it becomes 2 > 3. The result is false, so then ++j is evaluated and ++i is not. So the (again) incremented value of j (i.e. 4) is then assigned to val.
1
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
add a comment |
too late, but maybe useful.
(++i > ++j) ? ++i : ++j;
In the document ISO/IEC 9899:201xAnnex C(informative)Sequence points we find that there is a sequence point
Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated
In order to be well defined behavior one must not modify 2 times (via side-effects) the same object between 2 sequence points.
In your expression the only conflict that could appear would be between the first and second ++i or ++j.
At every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine (this is what you would compute on paper, like on a turing machine).
Quote from 5.1.2.3p3 Program execution
The presence of a sequence point between the evaluation of expressions A and B implies that every value computation and side effect associated with A is sequenced before every value computation and side effect associated with B.
When you have side-effects in your code, they are sequenced by different expressions. The rule says that between 2 sequence points you can permute these expressions as you wish.
For example. i = i++. Because none of the operators involved in this expression represent sequence points, you can permute the expressions that are side-effects as you want. The C language allows you to use any of these sequences
i = i; i = i+1; or i = i+1; i=i; or anything that provides the same result as the abstract semantics of computation asks for interpretation of this computation. The Standard ISO9899 defines the C language as abstract semantics.
I think the part where you enumerate the modifications toiandjas "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!
– max1000001
21 mins ago
add a comment |
There may be no UB in your program, but in the question:
Does the statement int val = (++i > ++j) ? ++i : ++j; invoke undefined behavior?
The answer is yes. Either or both of the increment operations may overflow, since i and j are signed, in which case all bets are off.
Of course this doesn't happen in your full example because you've specified the values as small integers.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55170504%2fdoes-the-statement-int-val-i-j-i-j-invoke-undefined-behavio%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
The behavior of this code is well defined.
The first expression in a conditional is guaranteed to be evaluated before either the second expression or the third expression, and only one of the second or third will be evaluated. This is described in section 6.5.15p4 of the C standard:
The first operand is evaluated; there is a sequence point
between its evaluation and the evaluation of the second or third
operand (whichever is evaluated). The second operand is evaluated
only if the first compares unequal to 0; the third operand is
evaluated only if the first compares equal to 0; the result is
the value of the second or third operand (whichever is
evaluated), converted to the type described below.
In the case of your expression:
int val = (++i > ++j) ? ++i : ++j;
++i > ++j is evaluated first. The incremented values of i and j are used in the comparison, so it becomes 2 > 3. The result is false, so then ++j is evaluated and ++i is not. So the (again) incremented value of j (i.e. 4) is then assigned to val.
1
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
add a comment |
The behavior of this code is well defined.
The first expression in a conditional is guaranteed to be evaluated before either the second expression or the third expression, and only one of the second or third will be evaluated. This is described in section 6.5.15p4 of the C standard:
The first operand is evaluated; there is a sequence point
between its evaluation and the evaluation of the second or third
operand (whichever is evaluated). The second operand is evaluated
only if the first compares unequal to 0; the third operand is
evaluated only if the first compares equal to 0; the result is
the value of the second or third operand (whichever is
evaluated), converted to the type described below.
In the case of your expression:
int val = (++i > ++j) ? ++i : ++j;
++i > ++j is evaluated first. The incremented values of i and j are used in the comparison, so it becomes 2 > 3. The result is false, so then ++j is evaluated and ++i is not. So the (again) incremented value of j (i.e. 4) is then assigned to val.
1
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
add a comment |
The behavior of this code is well defined.
The first expression in a conditional is guaranteed to be evaluated before either the second expression or the third expression, and only one of the second or third will be evaluated. This is described in section 6.5.15p4 of the C standard:
The first operand is evaluated; there is a sequence point
between its evaluation and the evaluation of the second or third
operand (whichever is evaluated). The second operand is evaluated
only if the first compares unequal to 0; the third operand is
evaluated only if the first compares equal to 0; the result is
the value of the second or third operand (whichever is
evaluated), converted to the type described below.
In the case of your expression:
int val = (++i > ++j) ? ++i : ++j;
++i > ++j is evaluated first. The incremented values of i and j are used in the comparison, so it becomes 2 > 3. The result is false, so then ++j is evaluated and ++i is not. So the (again) incremented value of j (i.e. 4) is then assigned to val.
The behavior of this code is well defined.
The first expression in a conditional is guaranteed to be evaluated before either the second expression or the third expression, and only one of the second or third will be evaluated. This is described in section 6.5.15p4 of the C standard:
The first operand is evaluated; there is a sequence point
between its evaluation and the evaluation of the second or third
operand (whichever is evaluated). The second operand is evaluated
only if the first compares unequal to 0; the third operand is
evaluated only if the first compares equal to 0; the result is
the value of the second or third operand (whichever is
evaluated), converted to the type described below.
In the case of your expression:
int val = (++i > ++j) ? ++i : ++j;
++i > ++j is evaluated first. The incremented values of i and j are used in the comparison, so it becomes 2 > 3. The result is false, so then ++j is evaluated and ++i is not. So the (again) incremented value of j (i.e. 4) is then assigned to val.
answered 1 hour ago
dbushdbush
102k13105143
102k13105143
1
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
add a comment |
1
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
1
1
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
Thank you for your detailed and direct answer!
– max1000001
1 hour ago
add a comment |
too late, but maybe useful.
(++i > ++j) ? ++i : ++j;
In the document ISO/IEC 9899:201xAnnex C(informative)Sequence points we find that there is a sequence point
Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated
In order to be well defined behavior one must not modify 2 times (via side-effects) the same object between 2 sequence points.
In your expression the only conflict that could appear would be between the first and second ++i or ++j.
At every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine (this is what you would compute on paper, like on a turing machine).
Quote from 5.1.2.3p3 Program execution
The presence of a sequence point between the evaluation of expressions A and B implies that every value computation and side effect associated with A is sequenced before every value computation and side effect associated with B.
When you have side-effects in your code, they are sequenced by different expressions. The rule says that between 2 sequence points you can permute these expressions as you wish.
For example. i = i++. Because none of the operators involved in this expression represent sequence points, you can permute the expressions that are side-effects as you want. The C language allows you to use any of these sequences
i = i; i = i+1; or i = i+1; i=i; or anything that provides the same result as the abstract semantics of computation asks for interpretation of this computation. The Standard ISO9899 defines the C language as abstract semantics.
I think the part where you enumerate the modifications toiandjas "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!
– max1000001
21 mins ago
add a comment |
too late, but maybe useful.
(++i > ++j) ? ++i : ++j;
In the document ISO/IEC 9899:201xAnnex C(informative)Sequence points we find that there is a sequence point
Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated
In order to be well defined behavior one must not modify 2 times (via side-effects) the same object between 2 sequence points.
In your expression the only conflict that could appear would be between the first and second ++i or ++j.
At every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine (this is what you would compute on paper, like on a turing machine).
Quote from 5.1.2.3p3 Program execution
The presence of a sequence point between the evaluation of expressions A and B implies that every value computation and side effect associated with A is sequenced before every value computation and side effect associated with B.
When you have side-effects in your code, they are sequenced by different expressions. The rule says that between 2 sequence points you can permute these expressions as you wish.
For example. i = i++. Because none of the operators involved in this expression represent sequence points, you can permute the expressions that are side-effects as you want. The C language allows you to use any of these sequences
i = i; i = i+1; or i = i+1; i=i; or anything that provides the same result as the abstract semantics of computation asks for interpretation of this computation. The Standard ISO9899 defines the C language as abstract semantics.
I think the part where you enumerate the modifications toiandjas "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!
– max1000001
21 mins ago
add a comment |
too late, but maybe useful.
(++i > ++j) ? ++i : ++j;
In the document ISO/IEC 9899:201xAnnex C(informative)Sequence points we find that there is a sequence point
Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated
In order to be well defined behavior one must not modify 2 times (via side-effects) the same object between 2 sequence points.
In your expression the only conflict that could appear would be between the first and second ++i or ++j.
At every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine (this is what you would compute on paper, like on a turing machine).
Quote from 5.1.2.3p3 Program execution
The presence of a sequence point between the evaluation of expressions A and B implies that every value computation and side effect associated with A is sequenced before every value computation and side effect associated with B.
When you have side-effects in your code, they are sequenced by different expressions. The rule says that between 2 sequence points you can permute these expressions as you wish.
For example. i = i++. Because none of the operators involved in this expression represent sequence points, you can permute the expressions that are side-effects as you want. The C language allows you to use any of these sequences
i = i; i = i+1; or i = i+1; i=i; or anything that provides the same result as the abstract semantics of computation asks for interpretation of this computation. The Standard ISO9899 defines the C language as abstract semantics.
too late, but maybe useful.
(++i > ++j) ? ++i : ++j;
In the document ISO/IEC 9899:201xAnnex C(informative)Sequence points we find that there is a sequence point
Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated
In order to be well defined behavior one must not modify 2 times (via side-effects) the same object between 2 sequence points.
In your expression the only conflict that could appear would be between the first and second ++i or ++j.
At every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine (this is what you would compute on paper, like on a turing machine).
Quote from 5.1.2.3p3 Program execution
The presence of a sequence point between the evaluation of expressions A and B implies that every value computation and side effect associated with A is sequenced before every value computation and side effect associated with B.
When you have side-effects in your code, they are sequenced by different expressions. The rule says that between 2 sequence points you can permute these expressions as you wish.
For example. i = i++. Because none of the operators involved in this expression represent sequence points, you can permute the expressions that are side-effects as you want. The C language allows you to use any of these sequences
i = i; i = i+1; or i = i+1; i=i; or anything that provides the same result as the abstract semantics of computation asks for interpretation of this computation. The Standard ISO9899 defines the C language as abstract semantics.
edited 7 mins ago
answered 28 mins ago
alinsoaralinsoar
8,75213251
8,75213251
I think the part where you enumerate the modifications toiandjas "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!
– max1000001
21 mins ago
add a comment |
I think the part where you enumerate the modifications toiandjas "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!
– max1000001
21 mins ago
I think the part where you enumerate the modifications to
i and j as "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!– max1000001
21 mins ago
I think the part where you enumerate the modifications to
i and j as "possible conflicts" adds something new and useful to the analysis. I hadn't thought of that, thanks!– max1000001
21 mins ago
add a comment |
There may be no UB in your program, but in the question:
Does the statement int val = (++i > ++j) ? ++i : ++j; invoke undefined behavior?
The answer is yes. Either or both of the increment operations may overflow, since i and j are signed, in which case all bets are off.
Of course this doesn't happen in your full example because you've specified the values as small integers.
add a comment |
There may be no UB in your program, but in the question:
Does the statement int val = (++i > ++j) ? ++i : ++j; invoke undefined behavior?
The answer is yes. Either or both of the increment operations may overflow, since i and j are signed, in which case all bets are off.
Of course this doesn't happen in your full example because you've specified the values as small integers.
add a comment |
There may be no UB in your program, but in the question:
Does the statement int val = (++i > ++j) ? ++i : ++j; invoke undefined behavior?
The answer is yes. Either or both of the increment operations may overflow, since i and j are signed, in which case all bets are off.
Of course this doesn't happen in your full example because you've specified the values as small integers.
There may be no UB in your program, but in the question:
Does the statement int val = (++i > ++j) ? ++i : ++j; invoke undefined behavior?
The answer is yes. Either or both of the increment operations may overflow, since i and j are signed, in which case all bets are off.
Of course this doesn't happen in your full example because you've specified the values as small integers.
answered 16 mins ago
Doug CurrieDoug Currie
35.8k77109
35.8k77109
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55170504%2fdoes-the-statement-int-val-i-j-i-j-invoke-undefined-behavio%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
It certainly invokes downvoting + VTC on stack overflow.
– SergeyA
1 hour ago
3
Is there a sequence point? Please see this answer which states there is one "Between the evaluations of the first operand of the conditional ?: operator and whichever of the second and third operands is evaluated (6.5.15)."
– Weather Vane
1 hour ago
You got 4. What did you expect?
– Bob Jarvis
1 hour ago
2
@Jean-FrançoisFabre No, but it doesn't need to be. There's no need for a sequence point between two changes of two different variables.
++i > ++iwould be UB though.– sepp2k
1 hour ago
1
@dandan78 maybe a duplicate, but not of that canonical
– Jean-François Fabre
1 hour ago