我很困惑如何为以下代码执行表达式。
#include<stdio.h>
int main()
{
int a[10];
a[0] = 1;
a[1] = 2;
printf("%d %d",a[0],a[1]);
a[0] = a[0] - (a[0] = a[1]); // not able to understand its flow of execution
printf("\n%d %d",a[0],a[1]);
}
这个的输出是
1 2
-1 2
我的疑问是括号内的赋值运算符在哪里执行并更改 a[0] 元素,并在表达式中使用,例如
指数:0 1
元素:1 2
期间表达式 : 2 2 // 当 (a[0] = a[1])
a[0] = a[0] - (a[0] - a[1]);
[0] = 1 - (2);
[0] = -1;
(或者)
指数:0 1
元素:1 2
期间表达式 : 1 2 // 当 (a[0] = a[1])
a[0] = a[0] - (a[0] - a[1]);
[0] = 1 - (2);
[0] = -1;
此外,关联属性也混淆了表达式是从左到右还是从右到左。
您的代码具有未定义的行为。
a[0] = a[0] - (a[0] = a[1]);
就其本身而言,子表达式(a[0] = a[1])
是有效的。它分配a[1]
to的值a[0]
,并产生分配的值。
问题是在单个表达式中a[0]
修改了两次,并且两次修改没有顺序,这意味着语言不会告诉我们哪个先发生。(在 C90/C99 术语中,两个修改不由序列点分隔。)
一个更简单的例子:
x = 2 + (x = 1);
这里x
修改了两次。该语言并不仅仅说这两种修改可以按任一顺序发生;它说行为是未定义的。换句话说,语言没有说明会发生什么。它可能会崩溃,它可能会给你一些垃圾结果,或者,最糟糕的是,它可能会做你期望它做的事情。(这是最糟糕的情况,因为这意味着您仍然存在一个难以检测和诊断的严重错误。)
底线:无论这行代码打算做什么,肯定有一种更清晰、更明确的方法来做到这一点。你问题中的代码,不要太苛刻,甚至可能不是C。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句