[英]Expression evaluation in C
为什么以下C代码打印12 12 12
int main(int argc, char const *argv[]) {
int a = 2, *f1, *f2;
f1 = f2 = &a;
*f2 += *f2 += a += 2.5;
printf("%i %i %i\n", a, *f1, *f2);
return 0;
}
*f2 += *f2 += a += 2.5;
此行具有未定义行为,因为您在同一表达式中多次更改*f2
(即a
)的值而没有插入序列点。 UB意味着您的程序可能会打印“Hello World”,它可能会崩溃,它可能会打印12 12 12
或12 12 1029
或者它可能会开始吃掉你的大脑。 不要依赖未定义的行为。
引用C ++标准(我知道问题标记为C,但我没有C标准,我知道同样的规则在C中保存)
除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.5)在前一个和下一个序列点之间,标量对象应该修改其存储值最多一次通过表达式的评价。 此外,只能访问先前值以确定要存储的值。 对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义 。
它为所有人打印出相同的值,因为你只指向一个int
变量: a
。
它输出12
因为a + 2.5 = 4
( a
是一个int
),然后你将它自己添加两次。
@Downvoters:为什么这么消极? 我想我的答案说明了这个编译器在这个示例代码上做了什么,这应该有助于OP理解行为。 我同意Armen Tsirunyan的回答是正确的(即应该得到勾号),并且根据标准 , 行为未定义 。 但标准已实现,我还没有看到编译器编译代码,然后在运行时突然抛出手并说出Undefined behaviour!
。
我因为*f2
和*f1
指向a
(整数)。
所以*f2 = &a = 2
且*f1 = &a = 2
此时,您将添加值2.5
(因为a
是一个整数,您将获得4
)。
比你有
a = 4
f2 = 4
f1 = 4
此时你做f2+f1+a = 12.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.