C学习笔记(自增)

自增

(1)后缀:与Turbo
C相同,在讲话停止前要说分号往日才会履打加。

(2)前缀:

眼前少独自增统一取值,前面的自增即为取值。

  int i=2,j;
  j=++i+(++i)+(++i);

j=4+4+5;

瞩目不可知一向写j=++i+++i+++i;

不然会报错error C2105: ‘++’ needs l-value;

因为++前边和的或者+,必须使左值才会++;

    int i=2,j;
    j=(i++)++;

这样吗一律会报错error
C2105: ‘++’ needs l-value;

盖i++重返的是一个数值
,而不是一个只是赋值的变量(左值);

联合取值必须是负前方片独又如若连在一起的,否则每一个且是由增即为取值。

    int i=2,j;
    j=++i+i+++(++i)+(++i);

j=3+3+4+5;

无论是int 仍然float都循那规则。

(3)在乘法中之应用规则:

i++*++i自动识别为++i*i++;

    int i=2,j1,j2;
    j1=i++*++i;
    i=2;
    j2=++i*i++;

j1=3*3;

j1==j2;

自减也是一样的。

 

于printf中,后缀自增也是以言辞截至是才举行操作的。

    int i=2;
    printf("%d\n",i=i++);
    i=2;
    printf("%d  %d\n",i,i++);

结果都是2。

 

《裘宗燕:C/C++ 语言中之表明式求值》小说摘要:

除此以外,想要知变量更新的价是否业已保存至了内存,需要专注顺序点在啥地方;

C/C++语言定义(语言的参考手册)明确概念了顺序点的概念。顺序点位于:

1. 每个完整表达式截止时。完整表明式包括变量起头化表达式,表明式语句,return语句的表明式,以及规格、循环和switch语句的支配表明式(for头部有三独操表明式);

2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象总括后;

3. 函数调用中针对具备实际参数与函数叫表明式(需要调用的函数也或通过表达式描述)的求值完成将来(进入函数体以前)。

以C/C++并没针对负有的演算顺序举办规定,而是到由编译器按照需要贯彻调整,从而赢得功效又胜的代码;

C++,Java则生严酷规定表达式求值顺序,但大多数序设计语言实际上都才故了类似C/C++的确定。

“何人知道下边C语句被n赋什么价值?”

m = 1; n = m++ +m++;

科学回答是:不亮堂!语言没有规定其当算有什么,结果完全倚重具序列统以切实上下文中之实际处理。

内牵涉到运算对象的求值顺序与变量修改的兑现时刻问题。

 

 评论区摘要:

②c99:
Annex J

J.1 Unspecified behavior:

— The order in which subexpressions are evaluated and the order in which side effects take place, 

except as specified for the function-call (), &&, ||, ?:, and comma operators (6.5).

— The order in which the function designator(操作数提醒符), arguments(实参), and subexpressions(子表明式)
within the arguments are evaluated in a function call (6.5.2.2).

— The order in which the operands of an assignment operator(赋值运算符的操作数)
are evaluated(被求值)
(6.5.16).
……..

J.2 Undefined behavior
— Between two sequence points(序列点/顺序点), an object is modified(修正)
more than once, or is modified

and the prior value is read other than(除了)
to determine the value to be stored (6.5).
……

 

④c++0x最后草案(FDIS )
ISO/IEC FDIS 14882 
N3290:
1.9 Program execution(执行)

15 Except where noted, evaluations of operands of individual operators and of subexpressions of individual 

expressions are unsequenced.
[
Note: In an expression that is evaluated more than once during the execution 

of a program,unsequenced and indeterminately sequenced evaluations
of its subexpressions need not be performed

consistently(一贯地)in
different evaluations.
—end note ] The value computations of the operands of 

an operator are sequenced before the value computation of the result of the operator.
If a side effect on a

 scalar object(标量对象)is unsequenced
relative to either another
side effect on the same scalar object or

a value computation using the value of the same scalar object, the behavior is undefined.

[ Example:
void f(int, int);

void g(int i, int* v) {

i = v[i++]; // the behavior is undefined

i = 7, i++, i++; // i becomes 9

i = i++ + 1; // the behavior is undefined

i = i + 1; // the value of i is incremented(递增)

f(i = -1, i = -1); // the behavior is undefined
}
—end example ]

When calling a function (whether or not the function is inline(内联)[内联函数继承了宏定义的亮点,也解除了她的欠缺]), 

every value computation and side effect
associated with any argument expression,
or with the postfix expression

designating(把…定名为)
the called function, is sequenced before execution of every

 expression or statement
in the body of the called function. [ Note: Value
computations and side effects

 associated with different argument expressions are 

unsequenced. —end note.]

Every evaluation in the calling function (including other function calls) that is not otherwise specifically 

sequenced before or after the execution of the body

 of the called function is
indeterminately sequenced with
respect to the execution of the called function.9 Several 

contexts in C++ cause evaluation of a
function call,even though no corresponding function call syntax appears i

n the translation unit. 

[ Example: Evaluation of a new expression invokes(借助)
one or more allocation and constructor functions; see 5.3.4. 

For another example,invocation of a conversion function (12.3.2) can arise in
contexts(上下文)in which no function call

 syntax appears.—end example ] The sequencing constraints(约束)
on the execution of the called function (as described above)

are features of the function calls as evaluated, whatever the syntax of the expression that calls the function
might be.

 

总:尽量不要写好出误会之表明式,因为运算顺序本身就不曾严峻规定,所以不用信编译器,不要信执行结果,有些业务真的是心有余而力不足敲定的。所以往日总计的演算规律,

也止称考试的时候看,要真正控制规律,如故要因而VC时按Alt+8、Alt+6和Alt+5,开汇编窗口、内存窗口以及寄存器窗口看每句C对许的汇编、单步执行并察算命应内存和

寄存器变化(Linux或Unix下足于于是GDB调试时,看各句C对许的汇编并单步执行考察相应内存和寄存器变化)。

还要有时老师说之东西吗是勿规范的,面对什么问题,都急需来同等栽刨根问底的旺盛。

 

参考:http://blog.csdn.net/chenbang110/article/details/9192595

参考:http://bbs.csdn.net/topics/370153775