什么是教育工具能够证明人们在C / C ++中所做的不必要的假设?

我想为SO准备一些教育工具,该工具应帮助初学者(和中级)程序员认识和挑战C,C ++及其平台中的不必要假设。


例子:


“整数环绕”

“每个人都有ASCII”

“我可以将函数指针存储在void *中”

我认为一个小的测试程序可以在各种平台上运行,这些平台运行“合理”的假设,这些假设是根据我们在SO中的经验得出的,通常是由许多没有经验/半经验的主流开发人员做出的,并记录了它们在不同机器上的破坏方式。


这样做的目的不是为了证明做某事是“安全的”(这是不可能做到的,如果测试失败则只能证明任何事情),而是向即使是最无知的人也演示最不起眼的表情如果其他计算机具有未定义或实现定义的行为,则在另一台计算机上中断。。


为此,我想问你:


如何改善这个想法?

哪些测试会很好,并且看起来会如何?

您是否可以在可以使用的平台上运行测试并发布结果,以便最终获得平台数据库,它们之间的差异以及为何允许这种差异?

我从一开始就制作了这个社区Wiki,因为我认为人们在阅读本文时想编辑我的笨拙。


更新感谢您的输入。我从您的答案中添加了一些案例,将看看是否可以像Greg建议的那样为此设置一个github。


更新:我为此创建了一个github存储库,文件为“ gotcha.c”:


http://github.com/lutherblissett/disenchanter

请在此处回答补丁或新想法,以便在此处进行讨论或澄清。然后,我将它们合并到gotcha.c中。


明月笑刀无情
浏览 592回答 3
3回答

Smart猫小萌

子表达式的评估顺序,包括函数调用的参数和运营商(例如,操作数+,-,=,*,/),以下除外:二进制逻辑运算符(&&和||),三元条件运算符(?:),以及逗号运算符(,)是未指定例如  int Hello()  {       return printf("Hello"); /* printf() returns the number of                                   characters successfully printed by it                               */  }  int World()  {       return printf("World !");  }  int main()  {      int a = Hello() + World(); //might print Hello World! or World! Hello      /**             ^                      |                 Functions can be called in either order      **/      return 0;  } 
打开App,查看更多内容
随时随地看视频慕课网APP