【发布时间】:2014-10-14 16:53:01
【问题描述】:
我被要求描述这些代码行在大学作业中做了什么
int main() {
int t1[] = {0,0,1,1,1}, t2[] = {0,0,1,1,1};
int *p1 = t1, *p2 = t2;
while (!*p1++ || !*p2++);
cout << (p1-t1) << endl;
cout << (p2-t2) << endl;
}
我的看法是,创建了 2 个 int 类型的数组并用值填充,创建了 2 个指针并指向每个数组,然后我就开始遇到麻烦了。
while (!*p1++ || !*p2++);
对我来说,这是说当0 将*p1 的位置移动一个位置或0 将*p2 的位置移动一个位置时,我真的对这个假设没有信心吗?
cout << (p1-t1) << endl;
然后我们转到cout,现在我的看法是,我从t1 的位置中减去p1 的位置,其中p1 是由while 定位的,@987654332 @ 指向数组中的第一个位置。
再说一次,我可能完全错了,我只是在学习指针,所以如果我的假设有误,请记住这一点。
【问题讨论】:
-
@Johntk:
main应该返回一个int。一些系统期望main返回0当且仅当程序成功完成他的工作。当main返回void时,系统会尝试读取退出状态,得到垃圾。 -
这几行代码在说明程序员不称职,或者在制作笑话代码。如果它进入您的代码库,则表明您的代码库审查过程需要重新设计。哦,它会打印
"5\n3\n",但这不是重要的部分。 -
我认为这项任务只是为了让我们思考和研究,而不是被告知或教我们这样编码。
-
我认为,老师应该在课前做出免责声明,“如果你写过这样的代码,我会解雇你,但现在,我们将成为编译器和执行者。" 并要求在学生敢于寻求外部帮助时提醒它。该代码似乎有效并且没有调用 UB(如果我错了,请不要挂我)。 IMO这只是一个学术问题,试图理解黑魔法咒语。错误...语句。
-
@JamesKanze - 但即使我从不编写这样的代码,我仍然必须能够阅读它,因为其他人会编写它。当应用程序崩溃时,“我不知道这段代码做了什么”不是可接受的答案。