C语言表达式与运算符详解
1. 序列点与未定义行为
在C语言中,序列点是程序执行过程中的一个点,在该点之前的所有副作用都已完成,之后的副作用尚未开始。例如,在进入或退出被调用函数时,就会出现序列点。
如果一个副作用相对于同一标量对象上的另一个副作用或使用该标量对象值的求值操作是无序的,那么代码就会产生未定义行为。标量类型可以是算术类型或指针类型。
以下代码展示了未定义行为:
int i = 5;
printf("Result = %d\n", i++ * i++);
你可能认为这段代码会输出30,但由于它存在未定义行为,实际结果并不确定。
为了避免未定义行为,我们可以将每个有副作用的操作放在单独的完整表达式中,确保在读取值之前副作用已经完成。例如:
int i = 5;
int j = i++;
int k = i++;
printf("Result = %d\n", j * k);
这段代码在每个有副作用的操作之间都有一个序列点。不过,由于原始代码没有明确的含义,我们无法确定重写后的代码是否符合程序员的原意。
我们也可以这样写,而不改变其行为:
int i = 5;
int j = i++;
printf("Result = %d\n", j * i++);
2. sizeof运算符
C语言表达式与运算符详解
超级会员免费看
订阅专栏 解锁全文
52

被折叠的 条评论
为什么被折叠?



