Tag: 历史

如何在各种编码中均匀检测整数的符号位(1的补码,2的补码,符号幅度)?

如何检测C中的int符号? 这个问题主要是历史机器。 我问的是如何区分整数是0还是-0。 在1的补码和符号/幅度int编码中,0(或+0)和-0都是可能的。 简单符号位测试是与0进行比较。 int x; printf(“sign bit is %s\n”, (x < 0) ? "set" : "not set"); 但是当x是-0时,这在1的补码和符号幅度上失败。 第一候选人方法:面膜测试。 由于C定义了int必须具有符号位而不管整数编码,因此以下内容应该有效。 int x; int SignBitMask = tbd; printf(“sign bit is %s\n”, (x & SignBitMask) ? “set” : “not set”); 问题变成如何确定C中SignBitMask的值? SignBitMask = INT_MAX + 1似乎是一个起点。 第二候选方法:创建函数并检查位模式: int IsSignBitSet(int x) { if (x > 0) […]

为什么C ++向后兼容C? 为什么没有一些“纯粹的”C ++语言?

C和C ++是不同的语言,我们知道blababla。 但如果这些语言不同,为什么仍然可以使用malloc或free这样的函数? 我确信C ++有各种各样的尘土飞扬的东西,因为C,但是由于C ++是另一种语言,为什么不删除这些东西,使它变得不那么臃肿,更干净清晰? 是因为它允许程序员在没有OO模型的情况下工作,还是因为某些编译器不支持C ++的高级抽象function?

“for(;;)”无限循环的习惯用法是否正确归因于PDP-11 C编译器?

最近我发现这篇文章声称喜欢for(;;) over while(1)无限循环的想法之所以出现,是因为最初在PDP-11上可用的C编译器为while(1)生成了额外的机器指令。 顺便说一句,即使是Visual C ++警告也倾向于前者 。 这种for(;;)成语的归属是多么现实?

为什么选择&符号作为C ++中引用的符号?

有没有人知道为什么选择&符号作为表示C ++引用的方式? AFAIK(虽然我没有附近的书),Stroustroup没有解释这个选择,我觉得有点奇怪,因为相同的符号已用于C中的地址。

为什么它认为’T * name’是C方式而’T * name’是C ++方式?

注意:这个问题是关于星号( * )的位置。 在大多数C代码中,我看到(例如,在Beej的网络编程指南中 ),所有变量声明/定义都使用T *name格式,即将*绑定到变量名称。 指针被认为属于变量,而不是类型。 在我看到的大多数C ++代码中,格式是T* name ,即它将*绑定到变量的类型。 指针被认为属于类型,而不是变量。 我自己,作为一个纯粹的C ++编码器,也使用这种格式,因为指针类型清楚(对我来说)属于类型,而不是变量。 (很明显,即使是C ++标准也在示例中使用了这种格式。:)) 这有(历史性的)原因吗? 当程序员开始做C ++时,思维方式是否有所改变? 如果一个C编码器(使用前一种格式)可以解释他/她使用它的原因,而不是后者,那也很好。

为什么C的“fopen”将“const char *”作为第二个参数?

它总是让我感到奇怪,C函数“fopen”将“const char *”作为第二个参数。 我认为如果在stdio.h中定义了位掩码,比如“IO_READ”等,那么读取代码和实现库代码会更容易,所以你可以这样做: FILE* myFile = fopen(“file.txt”, IO_READ | IO_WRITE); 它的实际存在方式是否存在程序化原因,还是仅仅是历史性的? (即“这就是它的方式。”)

Windows数据类型……为什么如此冗余/不合理?

有人可以确切地知道为什么定义了以下typedef s / #define ? 与原件相比,它们有什么价值? typedef char CHAR; #define CONST const typedef float FLOAT; typedef unsigned __int64 DWORD64; //A 64-bit “double”-word?! typedef ULONGLONG DWORDLONG; //What’s the difference? typedef ULONG_PTR DWORD_PTR; //What’s the difference? typedef long LONG_PTR; //Wasn’t INT_PTR enough? typedef signed int LONG32; //Why not “signed long”? typedef unsigned int UINT; //Wait.. UINT is […]

为什么FILE全部大写如FILE *?

这对我来说似乎很奇怪,其他大多数都是小写的。 有一些历史原因吗?

为什么/ C允许隐式函数和无类型变量声明?

为什么语言允许隐式声明函数和无类型变量? 我知道C是旧的,但是允许省略声明并且默认为int() (或者在变量的情况下为int )对我来说似乎并不那么理智,即使在那时也是如此。 那么,为什么它最初被引入? 它真的有用吗? 它实际上(仍然)使用过吗? 注意:我意识到现代编译器会给你警告(取决于你传递它们的标志),你可以抑制这个function。 那不是问题! 例: int main() { static bar = 7; // defaults to “int bar” return foo(bar); // defaults to a “int foo()” } int foo(int i) { return i; }

一个人的补充是一个现实世界的问题,还是一个历史问题?

另一个问题是关于确定C中的奇数/偶数,并且惯用(x&1)方法被正确地标记为基于补体的系统被破坏,C标准允许。 系统真的存在于计算机博物馆之外的“现实世界”吗? 自1970年代以来,我一直在编码,我很确定我从未见过这样的野兽。 有人在为这样的系统开发或测试代码吗? 如果没有,我们应该担心这些事情,还是应该将它们与纸带和打卡一起放入101室 ?