What is the result of i == (i = 2)?
up vote
39
down vote
favorite
Run the following code:
// In Java, output #####
public static void main(String args) {
int i = 1;
if(i == (i = 2)) {
System.out.println("@@@@@");
} else {
System.out.println("#####");
}
}
But:
// In C, output @@@@@,I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv) {
int i = 1;
if(i == (i = 2)) {
printf("@@@@@");
} else {
printf("#####");
}
return 0;
}
The motivation for asking this question comes from the following code:
// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger
// I am curious about the behavior of the variable prev.
public final int getAndUpdate(IntUnaryOperator updateFunction) {
int prev = get(), next = 0;
for (boolean haveNext = false;;) {
if (!haveNext)
next = updateFunction.applyAsInt(prev);
if (weakCompareAndSetVolatile(prev, next))
return prev;
haveNext = (prev == (prev = get()));
}
}
So, how to explain the above two different execution modes?
java c language-lawyer variable-assignment side-effects
|
show 9 more comments
up vote
39
down vote
favorite
Run the following code:
// In Java, output #####
public static void main(String args) {
int i = 1;
if(i == (i = 2)) {
System.out.println("@@@@@");
} else {
System.out.println("#####");
}
}
But:
// In C, output @@@@@,I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv) {
int i = 1;
if(i == (i = 2)) {
printf("@@@@@");
} else {
printf("#####");
}
return 0;
}
The motivation for asking this question comes from the following code:
// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger
// I am curious about the behavior of the variable prev.
public final int getAndUpdate(IntUnaryOperator updateFunction) {
int prev = get(), next = 0;
for (boolean haveNext = false;;) {
if (!haveNext)
next = updateFunction.applyAsInt(prev);
if (weakCompareAndSetVolatile(prev, next))
return prev;
haveNext = (prev == (prev = get()));
}
}
So, how to explain the above two different execution modes?
java c language-lawyer variable-assignment side-effects
12
One explains the two different execution modes by first noting that those are two entirely different languages. They happen to share some syntax, but that's where the similarities end.
– StoryTeller
Dec 2 at 6:44
4
The result is : a messy code. Better not imitate this unless you are running for a java obfuscation contest.
– Tristan
Dec 2 at 7:29
4
Possible duplicate of Logic differences in C and Java
– user202729
Dec 2 at 8:16
1
Undefined behavior and sequence points
– phuclv
Dec 2 at 16:32
1
@TheGreatDuck After your edit, the question is still valid and is no longer a duplicate, but the top voted answer contains a lot of unrelated parts (and the "two execution mode" statement no longer makes sense).
– user202729
Dec 4 at 10:06
|
show 9 more comments
up vote
39
down vote
favorite
up vote
39
down vote
favorite
Run the following code:
// In Java, output #####
public static void main(String args) {
int i = 1;
if(i == (i = 2)) {
System.out.println("@@@@@");
} else {
System.out.println("#####");
}
}
But:
// In C, output @@@@@,I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv) {
int i = 1;
if(i == (i = 2)) {
printf("@@@@@");
} else {
printf("#####");
}
return 0;
}
The motivation for asking this question comes from the following code:
// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger
// I am curious about the behavior of the variable prev.
public final int getAndUpdate(IntUnaryOperator updateFunction) {
int prev = get(), next = 0;
for (boolean haveNext = false;;) {
if (!haveNext)
next = updateFunction.applyAsInt(prev);
if (weakCompareAndSetVolatile(prev, next))
return prev;
haveNext = (prev == (prev = get()));
}
}
So, how to explain the above two different execution modes?
java c language-lawyer variable-assignment side-effects
Run the following code:
// In Java, output #####
public static void main(String args) {
int i = 1;
if(i == (i = 2)) {
System.out.println("@@@@@");
} else {
System.out.println("#####");
}
}
But:
// In C, output @@@@@,I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv) {
int i = 1;
if(i == (i = 2)) {
printf("@@@@@");
} else {
printf("#####");
}
return 0;
}
The motivation for asking this question comes from the following code:
// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger
// I am curious about the behavior of the variable prev.
public final int getAndUpdate(IntUnaryOperator updateFunction) {
int prev = get(), next = 0;
for (boolean haveNext = false;;) {
if (!haveNext)
next = updateFunction.applyAsInt(prev);
if (weakCompareAndSetVolatile(prev, next))
return prev;
haveNext = (prev == (prev = get()));
}
}
So, how to explain the above two different execution modes?
java c language-lawyer variable-assignment side-effects
java c language-lawyer variable-assignment side-effects
edited Dec 4 at 10:15
Sneftel
23.5k64077
23.5k64077
asked Dec 2 at 5:41
kangjianwei
435511
435511
12
One explains the two different execution modes by first noting that those are two entirely different languages. They happen to share some syntax, but that's where the similarities end.
– StoryTeller
Dec 2 at 6:44
4
The result is : a messy code. Better not imitate this unless you are running for a java obfuscation contest.
– Tristan
Dec 2 at 7:29
4
Possible duplicate of Logic differences in C and Java
– user202729
Dec 2 at 8:16
1
Undefined behavior and sequence points
– phuclv
Dec 2 at 16:32
1
@TheGreatDuck After your edit, the question is still valid and is no longer a duplicate, but the top voted answer contains a lot of unrelated parts (and the "two execution mode" statement no longer makes sense).
– user202729
Dec 4 at 10:06
|
show 9 more comments
12
One explains the two different execution modes by first noting that those are two entirely different languages. They happen to share some syntax, but that's where the similarities end.
– StoryTeller
Dec 2 at 6:44
4
The result is : a messy code. Better not imitate this unless you are running for a java obfuscation contest.
– Tristan
Dec 2 at 7:29
4
Possible duplicate of Logic differences in C and Java
– user202729
Dec 2 at 8:16
1
Undefined behavior and sequence points
– phuclv
Dec 2 at 16:32
1
@TheGreatDuck After your edit, the question is still valid and is no longer a duplicate, but the top voted answer contains a lot of unrelated parts (and the "two execution mode" statement no longer makes sense).
– user202729
Dec 4 at 10:06
12
12
One explains the two different execution modes by first noting that those are two entirely different languages. They happen to share some syntax, but that's where the similarities end.
– StoryTeller
Dec 2 at 6:44
One explains the two different execution modes by first noting that those are two entirely different languages. They happen to share some syntax, but that's where the similarities end.
– StoryTeller
Dec 2 at 6:44
4
4
The result is : a messy code. Better not imitate this unless you are running for a java obfuscation contest.
– Tristan
Dec 2 at 7:29
The result is : a messy code. Better not imitate this unless you are running for a java obfuscation contest.
– Tristan
Dec 2 at 7:29
4
4
Possible duplicate of Logic differences in C and Java
– user202729
Dec 2 at 8:16
Possible duplicate of Logic differences in C and Java
– user202729
Dec 2 at 8:16
1
1
Undefined behavior and sequence points
– phuclv
Dec 2 at 16:32
Undefined behavior and sequence points
– phuclv
Dec 2 at 16:32
1
1
@TheGreatDuck After your edit, the question is still valid and is no longer a duplicate, but the top voted answer contains a lot of unrelated parts (and the "two execution mode" statement no longer makes sense).
– user202729
Dec 4 at 10:06
@TheGreatDuck After your edit, the question is still valid and is no longer a duplicate, but the top voted answer contains a lot of unrelated parts (and the "two execution mode" statement no longer makes sense).
– user202729
Dec 4 at 10:06
|
show 9 more comments
3 Answers
3
active
oldest
votes
up vote
56
down vote
The behaviour of a C program that executes the expression i == (i = 2)
is undefined.
It comes from C11 6.5p22:
- If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)
The i
on the left-hand side of ==
is a value computation on the value of scalar object i
and the right-hand side i = 2
has a side effect of assigning the value 2
to i
. The LHS and RHS of ==
are unsequenced w.r.t. each other. Hence the entire program is meaningless in C.
Compile with gcc -Wall
and GCC will spit out:
unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~
Unlike C, Java guarantees the evaluation order for operands (left-to-right), therefore
haveNext = (prev == (prev = get()));
is correct in Java. The value of LHS is determined strictly before the evaluation of the side effect on the RHS occurs.
In C you have to write this as something like
newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;
Why isi
on the LHS a value computation? Is it specified somewhere in the Standard?
– Some Name
Dec 2 at 6:11
1
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
So how about reference? :) The only I could find was thevalue
term defined in 3.19, but novalue computation
defined there.
– Some Name
Dec 2 at 6:13
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. Ifi
there was not a value of an expression thena[i++] = i;
would be defined. Footnotes are not normative though.
– Antti Haapala
Dec 2 at 6:34
1
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2
– Antti Haapala
Dec 2 at 6:39
|
show 6 more comments
up vote
15
down vote
The Java Language Specification (§15.7) states:
The Java programming language guarantees that the operands of operators appear
to be evaluated in a specific evaluation order, namely, from left to right.
The specification (§15.21.1) also states that:
The value produced by the
==
operator istrue
if the value of the left-hand
operand is equal to the value of the right-hand operand; otherwise, the result is
false
.
Therefore in Java, the if-statement at runtime would look like the following, which obviously evaluates to false
:
if (1 == 2) {
}
In C, it is simply undefined (see Antti's answer).
add a comment |
up vote
5
down vote
In C, the behavior of i == (i = 2)
is undefined because it attempts to both update an object and use that object’s value in a computation without an intervening sequence point. The result will vary based on the compiler, compiler settings, even the surrounding code.
what about Java?
– The Great Duck
Dec 3 at 3:57
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',
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%2f53577739%2fwhat-is-the-result-of-i-i-2%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
up vote
56
down vote
The behaviour of a C program that executes the expression i == (i = 2)
is undefined.
It comes from C11 6.5p22:
- If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)
The i
on the left-hand side of ==
is a value computation on the value of scalar object i
and the right-hand side i = 2
has a side effect of assigning the value 2
to i
. The LHS and RHS of ==
are unsequenced w.r.t. each other. Hence the entire program is meaningless in C.
Compile with gcc -Wall
and GCC will spit out:
unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~
Unlike C, Java guarantees the evaluation order for operands (left-to-right), therefore
haveNext = (prev == (prev = get()));
is correct in Java. The value of LHS is determined strictly before the evaluation of the side effect on the RHS occurs.
In C you have to write this as something like
newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;
Why isi
on the LHS a value computation? Is it specified somewhere in the Standard?
– Some Name
Dec 2 at 6:11
1
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
So how about reference? :) The only I could find was thevalue
term defined in 3.19, but novalue computation
defined there.
– Some Name
Dec 2 at 6:13
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. Ifi
there was not a value of an expression thena[i++] = i;
would be defined. Footnotes are not normative though.
– Antti Haapala
Dec 2 at 6:34
1
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2
– Antti Haapala
Dec 2 at 6:39
|
show 6 more comments
up vote
56
down vote
The behaviour of a C program that executes the expression i == (i = 2)
is undefined.
It comes from C11 6.5p22:
- If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)
The i
on the left-hand side of ==
is a value computation on the value of scalar object i
and the right-hand side i = 2
has a side effect of assigning the value 2
to i
. The LHS and RHS of ==
are unsequenced w.r.t. each other. Hence the entire program is meaningless in C.
Compile with gcc -Wall
and GCC will spit out:
unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~
Unlike C, Java guarantees the evaluation order for operands (left-to-right), therefore
haveNext = (prev == (prev = get()));
is correct in Java. The value of LHS is determined strictly before the evaluation of the side effect on the RHS occurs.
In C you have to write this as something like
newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;
Why isi
on the LHS a value computation? Is it specified somewhere in the Standard?
– Some Name
Dec 2 at 6:11
1
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
So how about reference? :) The only I could find was thevalue
term defined in 3.19, but novalue computation
defined there.
– Some Name
Dec 2 at 6:13
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. Ifi
there was not a value of an expression thena[i++] = i;
would be defined. Footnotes are not normative though.
– Antti Haapala
Dec 2 at 6:34
1
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2
– Antti Haapala
Dec 2 at 6:39
|
show 6 more comments
up vote
56
down vote
up vote
56
down vote
The behaviour of a C program that executes the expression i == (i = 2)
is undefined.
It comes from C11 6.5p22:
- If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)
The i
on the left-hand side of ==
is a value computation on the value of scalar object i
and the right-hand side i = 2
has a side effect of assigning the value 2
to i
. The LHS and RHS of ==
are unsequenced w.r.t. each other. Hence the entire program is meaningless in C.
Compile with gcc -Wall
and GCC will spit out:
unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~
Unlike C, Java guarantees the evaluation order for operands (left-to-right), therefore
haveNext = (prev == (prev = get()));
is correct in Java. The value of LHS is determined strictly before the evaluation of the side effect on the RHS occurs.
In C you have to write this as something like
newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;
The behaviour of a C program that executes the expression i == (i = 2)
is undefined.
It comes from C11 6.5p22:
- If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)
The i
on the left-hand side of ==
is a value computation on the value of scalar object i
and the right-hand side i = 2
has a side effect of assigning the value 2
to i
. The LHS and RHS of ==
are unsequenced w.r.t. each other. Hence the entire program is meaningless in C.
Compile with gcc -Wall
and GCC will spit out:
unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~
Unlike C, Java guarantees the evaluation order for operands (left-to-right), therefore
haveNext = (prev == (prev = get()));
is correct in Java. The value of LHS is determined strictly before the evaluation of the side effect on the RHS occurs.
In C you have to write this as something like
newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;
edited Dec 2 at 6:40
answered Dec 2 at 5:50
Antti Haapala
79.9k16148193
79.9k16148193
Why isi
on the LHS a value computation? Is it specified somewhere in the Standard?
– Some Name
Dec 2 at 6:11
1
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
So how about reference? :) The only I could find was thevalue
term defined in 3.19, but novalue computation
defined there.
– Some Name
Dec 2 at 6:13
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. Ifi
there was not a value of an expression thena[i++] = i;
would be defined. Footnotes are not normative though.
– Antti Haapala
Dec 2 at 6:34
1
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2
– Antti Haapala
Dec 2 at 6:39
|
show 6 more comments
Why isi
on the LHS a value computation? Is it specified somewhere in the Standard?
– Some Name
Dec 2 at 6:11
1
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
So how about reference? :) The only I could find was thevalue
term defined in 3.19, but novalue computation
defined there.
– Some Name
Dec 2 at 6:13
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. Ifi
there was not a value of an expression thena[i++] = i;
would be defined. Footnotes are not normative though.
– Antti Haapala
Dec 2 at 6:34
1
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2
– Antti Haapala
Dec 2 at 6:39
Why is
i
on the LHS a value computation? Is it specified somewhere in the Standard?– Some Name
Dec 2 at 6:11
Why is
i
on the LHS a value computation? Is it specified somewhere in the Standard?– Some Name
Dec 2 at 6:11
1
1
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
@SomeName of course it is specified somewhere in the standard. :D
– Antti Haapala
Dec 2 at 6:11
So how about reference? :) The only I could find was the
value
term defined in 3.19, but no value computation
defined there.– Some Name
Dec 2 at 6:13
So how about reference? :) The only I could find was the
value
term defined in 3.19, but no value computation
defined there.– Some Name
Dec 2 at 6:13
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. If
i
there was not a value of an expression then a[i++] = i;
would be defined. Footnotes are not normative though.– Antti Haapala
Dec 2 at 6:34
@SomeName you need to infer it from way too many places in the prose :/ the footnote 84 however can be used as a shortcut. If
i
there was not a value of an expression then a[i++] = i;
would be defined. Footnotes are not normative though.– Antti Haapala
Dec 2 at 6:34
1
1
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,
i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2– Antti Haapala
Dec 2 at 6:39
@SomeName 5.1.2.3p2 says "value computation of lvalue expression", which is a case here,
i
is an lvalue and its value need to be computed, as it is not an operand. 6.3.2.1p2 says "converted to the value stored in the designated object", but this is the one referred to by 5.1.2.3p2– Antti Haapala
Dec 2 at 6:39
|
show 6 more comments
up vote
15
down vote
The Java Language Specification (§15.7) states:
The Java programming language guarantees that the operands of operators appear
to be evaluated in a specific evaluation order, namely, from left to right.
The specification (§15.21.1) also states that:
The value produced by the
==
operator istrue
if the value of the left-hand
operand is equal to the value of the right-hand operand; otherwise, the result is
false
.
Therefore in Java, the if-statement at runtime would look like the following, which obviously evaluates to false
:
if (1 == 2) {
}
In C, it is simply undefined (see Antti's answer).
add a comment |
up vote
15
down vote
The Java Language Specification (§15.7) states:
The Java programming language guarantees that the operands of operators appear
to be evaluated in a specific evaluation order, namely, from left to right.
The specification (§15.21.1) also states that:
The value produced by the
==
operator istrue
if the value of the left-hand
operand is equal to the value of the right-hand operand; otherwise, the result is
false
.
Therefore in Java, the if-statement at runtime would look like the following, which obviously evaluates to false
:
if (1 == 2) {
}
In C, it is simply undefined (see Antti's answer).
add a comment |
up vote
15
down vote
up vote
15
down vote
The Java Language Specification (§15.7) states:
The Java programming language guarantees that the operands of operators appear
to be evaluated in a specific evaluation order, namely, from left to right.
The specification (§15.21.1) also states that:
The value produced by the
==
operator istrue
if the value of the left-hand
operand is equal to the value of the right-hand operand; otherwise, the result is
false
.
Therefore in Java, the if-statement at runtime would look like the following, which obviously evaluates to false
:
if (1 == 2) {
}
In C, it is simply undefined (see Antti's answer).
The Java Language Specification (§15.7) states:
The Java programming language guarantees that the operands of operators appear
to be evaluated in a specific evaluation order, namely, from left to right.
The specification (§15.21.1) also states that:
The value produced by the
==
operator istrue
if the value of the left-hand
operand is equal to the value of the right-hand operand; otherwise, the result is
false
.
Therefore in Java, the if-statement at runtime would look like the following, which obviously evaluates to false
:
if (1 == 2) {
}
In C, it is simply undefined (see Antti's answer).
edited Dec 2 at 6:04
answered Dec 2 at 5:57
Jacob G.
15.2k52062
15.2k52062
add a comment |
add a comment |
up vote
5
down vote
In C, the behavior of i == (i = 2)
is undefined because it attempts to both update an object and use that object’s value in a computation without an intervening sequence point. The result will vary based on the compiler, compiler settings, even the surrounding code.
what about Java?
– The Great Duck
Dec 3 at 3:57
add a comment |
up vote
5
down vote
In C, the behavior of i == (i = 2)
is undefined because it attempts to both update an object and use that object’s value in a computation without an intervening sequence point. The result will vary based on the compiler, compiler settings, even the surrounding code.
what about Java?
– The Great Duck
Dec 3 at 3:57
add a comment |
up vote
5
down vote
up vote
5
down vote
In C, the behavior of i == (i = 2)
is undefined because it attempts to both update an object and use that object’s value in a computation without an intervening sequence point. The result will vary based on the compiler, compiler settings, even the surrounding code.
In C, the behavior of i == (i = 2)
is undefined because it attempts to both update an object and use that object’s value in a computation without an intervening sequence point. The result will vary based on the compiler, compiler settings, even the surrounding code.
answered Dec 2 at 5:55
John Bode
81k1375149
81k1375149
what about Java?
– The Great Duck
Dec 3 at 3:57
add a comment |
what about Java?
– The Great Duck
Dec 3 at 3:57
what about Java?
– The Great Duck
Dec 3 at 3:57
what about Java?
– The Great Duck
Dec 3 at 3:57
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f53577739%2fwhat-is-the-result-of-i-i-2%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
12
One explains the two different execution modes by first noting that those are two entirely different languages. They happen to share some syntax, but that's where the similarities end.
– StoryTeller
Dec 2 at 6:44
4
The result is : a messy code. Better not imitate this unless you are running for a java obfuscation contest.
– Tristan
Dec 2 at 7:29
4
Possible duplicate of Logic differences in C and Java
– user202729
Dec 2 at 8:16
1
Undefined behavior and sequence points
– phuclv
Dec 2 at 16:32
1
@TheGreatDuck After your edit, the question is still valid and is no longer a duplicate, but the top voted answer contains a lot of unrelated parts (and the "two execution mode" statement no longer makes sense).
– user202729
Dec 4 at 10:06