C语言中的int main()返回一个int,但shell只接受无符号字符
我了解到,在C语言中,main()通常返回int。 到目前为止,我已经测试过了。例如,int是4个字节, 但是shell只接受从main()返回的未签名字符。 在我的系统(Linux、FreeBSD和NetBSD)上,shell(bash和tcsh)可能只接受最右边的一个字节。例如,如果main()返回0xabcdef0a,在shell中编译并运行之后,然后发出命令echo$?,则所有系统中的结果始终为10(0x0a)。所以我的问题是,为什么main()不返回一个无符号字符而不是int?将注释转换为答案 原因很常见:历史。20世纪70年代早期,当该约定建立时,C中没有C语言中的int main()返回一个int,但shell只接受无符号字符,c,bash,tcsh,C,Bash,Tcsh,我了解到,在C语言中,main()通常返回int。 到目前为止,我已经测试过了。例如,int是4个字节, 但是shell只接受从main()返回的未签名字符。 在我的系统(Linux、FreeBSD和NetBSD)上,shell(bash和tcsh)可能只接受最右边的一个字节。例如,如果main()返回0xabcdef0a,在shell中编译并运行之后,然后发出命令echo$?,则所有系统中的结果始终为10(0x0a)。所以我的问题是,为什么main()不返回一个无符号字符而不是int?将注释转
无符号字符类型。此外,捕获退出状态的进程获得一个16位值,其中8位是退出状态,8位是信号相关信息(如果孩子没有死于信号,则为0)。而在建立这个模型的时候,int
通常是16位,因此使用int
是合适的
您还可以查看如何将评论转换为答案
原因很常见:历史。20世纪70年代早期,当该约定建立时,C中没有无符号字符类型。此外,捕获退出状态的进程获得一个16位值,其中8位是退出状态,8位是信号相关信息(如果孩子没有死于信号,则为0)。而在建立这个模型的时候,int
通常是16位,因此使用int
是合适的
您还可以查看历史记录-当约定建立时,C中没有任何无符号字符。此外,捕获退出状态的进程获得一个16位值,其中8位是退出状态,8位是信号相关信息(如果孩子没有死于信号,则为0)。在建立这个模型的时候,int
通常是16位,所以int
是合适的。@JonathanLeffler感谢您的澄清。这让我明白了。:-)为了让这一切顺利进行,需要做些什么?@Nguaial,…“工作”?一切都已经按照POSIX的定义正常工作了。在POSIX规范中,emphasis补充道:“当使用特殊参数“?”报告退出状态时,shell应报告可用的全部八位退出状态”。因此,shell在$?
.History中表示的内容不应超过8位-当约定建立时,C中没有任何无符号字符。此外,捕获退出状态的进程获得一个16位值,其中8位是退出状态,8位是信号相关信息(如果孩子没有死于信号,则为0)。在建立这个模型的时候,int
通常是16位,所以int
是合适的。@JonathanLeffler感谢您的澄清。这让我明白了。:-)为了让这一切顺利进行,需要做些什么?@Nguaial,…“工作”?一切都已经按照POSIX的定义正常工作了。在POSIX规范中,emphasis补充道:“当使用特殊参数“?”报告退出状态时,shell应报告可用的全部八位退出状态”。因此,shell的内容不应超过8位,以$?
表示。批处理文件中用于对程序的退出值执行操作的旧MS-DOSerrorlevel
的最大值为255(8位)。批处理文件中用于对程序的退出值执行操作的旧MS-DOSerrorlevel
,最大值为255(8位)。