Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
299 views
in Technique[技术] by (71.8m points)

c++ - Using assignment as a condition expression?

Consider:

if (a=5) {
   /* do something */
}

How does the assignment work as a condition?

Is it based on non-zero value of l-value?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

C++ — ISO/IEC 14882:2003(E)

[5.17/1] There are several assignment operators, all of which group right-to-left. All require a modifiable lvalue as their left operand, and the type of an assignment expression is that of its left operand. The result of the assignment operation is the value stored in the left operand after the assignment has taken place; the result is an lvalue.

The result of the expression a = 5 is 5.

[6.4/4] [..] The value of a condition that is an expression is the value of the expression, implicitly converted to bool for statements other than switch. [..]

A conversion to bool takes place.

[4.12/1] An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true.

5 converts to boolean true.

[6.4.1/1] If the condition (6.4) yields true the first substatement is executed. [..]

true is treated as an if statement success.


C — ISO/IEC 9899:1999(E)

[6.5.16/3] An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue. [..]

The result of the expression a = 5 is 5.

[6.8.4.1/2] In both forms, the first substatement is executed if the expression compares unequal to 0. [..]

5 is treated as an if statement success.


General

Code like this is almost always a mistake; the author likely intended if (a == 5) {}. However, sometimes it is deliberate. You may see code like this:

if (x = foo()) {
   cout << "I set x to the result of foo(), which is truthy";
   // ... stuff
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...