我在解决练习测试时遇到了这个问题
考虑这个C代码来交换两个整数和这五个语句:
void swap (int *px, int *py) {
*px = *px – *py;
*py = *px + *py;
*px = *py – *px;
}
S1:将生成编译错误
S2:可能会在运行时根据传递的参数生成分段错误
S3:正确实现所有输入指针的交换过程,引用存储在进程可访问的内存位置的整数
S4:对某些但不是所有有效的输入指针正确实现交换过程
S5:可以加或减整数和指针。
以上哪个陈述是正确的?
我认为S2和S3。任何人都可以确认
答案 0 :(得分:3)
我不相信S3会持有,因为如果你用px == py
来调用它,它只会在第一行中将整数设置为0(*px = *px - *py
则相当于*px = *px - *px
这显然在*px
中存储了0。将所有输入数据设置为0后,它无法恢复并重新生成该值。
答案 1 :(得分:2)
S1: False, the code will compile
S2: True, never checks for NULL
S3: False, as unwind pointed out, if px == py it would fail
S4: True for the case cited above
S5: False, never subtracts any pointers
编辑:我错误地说代码没有交换:)
答案 2 :(得分:1)
您非常接近,但知道(签名)整数溢出会产生未定义的行为。这可能会略微改变你的答案。
答案 3 :(得分:0)
如果没有别名问题,它实际上会交换值:
px | PY
-------------------------------------------------- -----------------------------
px:= px-py |
| py:= px + py => px-py + py = px
px:= py-px => px-(px-py)= py |