【发布时间】:2012-10-18 09:18:13
【问题描述】:
我有一个while 循环,如下所示。
while (*d++ = *sc++)
由于我希望了解部门中的指针,我想进入while 循环并了解while 循环如何处理指针。
我在gdb 中使用了step,但它并没有完全进入while 循环。有什么方法可以进入while 循环并了解每个 步骤中的操作。
【问题讨论】:
我有一个while 循环,如下所示。
while (*d++ = *sc++)
由于我希望了解部门中的指针,我想进入while 循环并了解while 循环如何处理指针。
我在gdb 中使用了step,但它并没有完全进入while 循环。有什么方法可以进入while 循环并了解每个 步骤中的操作。
【问题讨论】:
* 绑定比后缀++ 更紧密。右侧的++ 将被最后应用,所以:
while (*d++ = *sc++)
等同于:
while (*d = *sc)
{
d++;
sc++;
修改最好在gdb中追踪。
更新:
不要像这样的 OP 编码!
虽然它看起来很酷,但证明你很聪明。普通人脑难以解析,容易出错?我们不想要,是吗?
最好选择上面建议的更清晰的替代方案,让编译器打乱代码。
【讨论】:
"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." -Brian Kernighan
while (*s++ = *t++);...虽然这乍一看可能看起来很神秘,但符号上的便利性是相当可观的,而且这个成语应该掌握,因为你会经常在C程序中看到它。” (有些转述,“C 编程语言”,第 5.5 节)?
选项 1: 按照 Olaf Dietsche 的建议查看 assembly code debugging。
选项 2:
汇编后使用gcc -S test.c 停止编译器以查看程序的汇编代码。理解汇编代码可能有点困难。更多信息here
选项 3: 将您的程序重写为类似
while(1)
{
if(*d++ != *sc++)
{
break;
}
}
这样您就可以放置断点并查看值的变化。
【讨论】:
编写代码的另一种但相同的方法是:
*d = *sc;
while (*d > 0)
{
d++;
sc++;
*d = *sc;
}
【讨论】: