为什么我为变量c
和d
获取不同的输出?我该如何解释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
答案 0 :(得分:4)
为什么我得到变量c和d的不同输出?
由于该计划的 Undefined Behavior 。声明
c=(float)++i + ++i;
正尝试在两个sequence point之间修改i
两次。两个序列点之间的修改只能对变量进行一次。
<强> C-FAQ: 3.8: 强>
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,只能访问先前值以确定要存储的值。
在表达式A和B的评估之间存在序列点意味着在与B相关联的每个值计算和副作用之前,对与A相关联的每个值计算和副作用进行排序。
语句相同
d= ++d + ++d; //Modifying d three times
e= ++e + ++e + ++e; //Modifying e four times
旁注:
以下是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) §