什么是执行的顺序,c中的关联性?

时间:2013-12-20 09:38:28

标签: c unary-operator

为什么我为变量cd获取不同的输出?我该如何解释e?任何人都可以提供线索吗?

 #include <stdio.h>
 #include <string.h> 

 main()
 {
    int i=10,d=10,e=10;
    float c;
    c=(float)++i + ++i;
    d= ++d  + ++d;
    e= ++e  + ++e + ++e;
    printf("d=%d\n c=%f\n e=%d ",d,c,e);       
 }

这是输出。

d=24
c=23.000000
e=37

1 个答案:

答案 0 :(得分:4)

  

为什么我得到变量c和d的不同输出?

由于该计划的 Undefined Behavior 。声明

c=(float)++i + ++i;  

正尝试在两个sequence point之间修改i两次。两个序列点之间的修改只能对变量进行一次。

<强> C-FAQ: 3.8:

  

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,只能访问先前值以确定要存储的值。

C11:5.1.2.3程序执行:

  

在表达式A和B的评估之间存在序列点意味着在与B相关联的每个值计算和副作用之前,对与A相关联的每个值计算和副作用进行排序。

语句相同

d= ++d  + ++d;            //Modifying d three times
e= ++e  + ++e + ++e;      //Modifying e four times

旁注:

C11:附件C:序列点:

  

以下是5.1.2.3中描述的序列点:
   - 在函数指示符的评估和函数中的实际参数之间   打电话和实际通话。 (6.5.2.2)。
   - 在以下运算符的第一个和第二个操作数的评估之间:   逻辑AND && (6.5.13);逻辑OR ||(6.5.14);逗号,(6.5.17)。
   - 在条件 ?: 运算符的第一个操作数的计算之间   评估第二和第三个操作数中的任何一个(6.5.15)    - 完整声明者的结尾:声明者(6.7.6);
   - 在评估完整表达式和下一个完整表达式之间   评估。以下是完整表达式:不属于a的初始化程序   复合字面值(6.7.9);表达式中的表达式(6.8.3);该   控制选择语句的表达( if switch )(6.8.4);该   控制 while do 声明(6.8.5)的表达;每个(可选)    for 语句的表达式(6.8.5.3); return 中的(可选)表达式   声明(6.8.6.4)    - 在库函数返回之前(7.1.4)    - 与每个格式化输入/输出功能转换相关的动作之后   说明符(7.21.6,7.29.2)    - 在每次调用比较函数之前和之后立即,和   也可以在对比较函数的任何调用和对象的任何移动之间进行   作为该调用的参数传递(7.22.5)   §