2

为什么我得到不同的变量输出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
4

1 回答 1

4

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

由于程序的未定义行为。陈述

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

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

常见问题解答:3.8:

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

C11:5.1.2.3 程序执行:

在表达式 A 和 B 的求值之间存在一个序列点意味着与 A 相关的每个值计算和副作用都在与 B 相关的每个值计算和副作用之前排序。

语句相同

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)。
— 在以下运算符的第一个和第二个操作数的计算之间:逻辑与&&(6.5.13);逻辑或||(6.5.14);逗号,(6.5.17)。
— 在条件?:运算符的第一个操作数的求值与第二和第三个操作数中的任何一个求值之间(6.5.15)。
— 完整声明符的结尾:声明符(6.7.6);
— 在完整表达式的计算和要计算的下一个完整表达式之间。以下是完整的表达式: 不属于复合文字(6.7.9)的初始化器;表达式语句中的表达式 (6.8.3);if选择语句(或)的控制表达式switch(6.8.4);whileor语句的控制表达式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)。
§

于 2013-12-20T09:39:13.510 回答