gpt4 book ai didi

c - K&R C 编程语言 - 练习 2-2 : Check my work?

转载 作者:行者123 更新时间:2023-11-30 15:28:20 25 4
gpt4 key购买 nike

我并没有完全在这个练习中挣扎(天哪,在 1-20 到 1-24 之后......),但我想知道我的解决方案是否有问题。本练习要求您编写一个与以下内容等效的循环:

for (i=0; i<lim-1 && (c=getchar()) != '\n' && c!= EOF; ++i)
s[i] = c;

不使用||或者 &&。我选择不使用任何尚未向我介绍的语言功能,并且我认真对待每个练习都放在其应有位置的想法,因为目的是让用户使用所提供的概念。因此,我想出了这个:

for (i=0; (i<lim-1) == ((c=getchar()) != EOF) == (c != '\n'); ++i)
s[i] = c;

有一个更漂亮的解决方案,涉及简单的 if/else if 类型条件,但我想利用本节关于具有基于其真或假等的数值的表达式的讨论。问题是,我的解决方案不在我通常检查有效练习解决方案的任何网站中,因此即使它看起来工作原理相同。我想知道我这样做除了丑陋之外还有什么问题吗?功能有什么不同吗?

最佳答案

除此之外,它是未定义的行为,因为它取决于评估顺序。 &&||肯定首先评估它们的左操作数,但是 ==没有。所以不能保证第二次使用c将引用新值而不是前一个循环中的值(或第一次的未初始化值。)

&&的短路评估是原始循环语义的重要组成部分。事实是&&如果第一个操作数为 false,则不计算第二个操作数意味着原始循环保证调用 getchar不超过lim-1次。重写后没有&& , getchari时将被额外调用一次达到lim-1 ,然后读取的字符(如果有的话)被放入位桶中,这意味着下一次尝试读取输入时该字符将丢失。

最后,a == ba && b 不同。它适用于 (c != EOF) == (c != '\n')因为这两个条件不可能都是假的——这是一个有趣的观察——但它不能替代 (i < lim-1) && ... .

关于c - K&R C 编程语言 - 练习 2-2 : Check my work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com