向我提出的问题是,即使我们在命令提示符处提供整数/浮点参数,它们在 C 语言中仍然被视为字符串或不被视为字符串。我不确定这是否有任何帮助。这在 C 语言中是否正确,为什么?那么像 Java 或 python 这样的其他人呢?
3 回答
确实,与语言无关,Unix 程序的命令行参数是字符串。如果程序选择将它们解释为数字,那很好,但这是因为程序(或程序员)选择这样做。类似地,一种语言的运行时支持可能会将 o/s 传递的参数更改为整数或浮点类型,但 o/s 将字符串传递给该运行时(我知道没有一种语言可以做到这一点,但我不主张了解所有语言)。
要看到这一点,请注意执行程序的方法是exec*()
函数族,其中每一个都接受一个字符串,它是要执行的程序的名称,以及一个字符串数组,它是要传递给程序。诸如system()
和之类的函数popen()
是在函数族之上构建的exec*()
——当然,它们也使用fork()
。甚至该posix_spawn()
函数也需要一个指向字符串的指针数组,用于生成程序的参数。
这与邮寄没有信封的信没有什么不同。我们都同意使用称为信封的通用外壳。操作系统使用称为字符串的通用项将参数传递给程序。了解程序想要对参数做什么超出了操作系统的范围。
有一些例外,我想到的一个是将参数传递给 Linux 内核模块。这些可以作为字符串以外的项目传递。
基本上,这是在操作系统和程序之间创建接口的问题。任何程序。请记住,程序并不总是用 C 编写的,而且您甚至不知道是否有类似的东西float
或int
语言中的东西。
您希望能够传递多个参数(使用自然分隔符),这些参数可以轻松编码任意信息。在 C 中,字符串可以是任意长度,唯一的限制是其中的零字节表示字符串的结尾。这是将任意信息传递给程序的一种高度灵活且自然的方式。
因此,您永远不能直接向程序提供任意整数/浮点参数;操作系统(Unix / Linux / Windows / 等)不会让你。您没有任何工具可以为您提供该界面,就像您无法将鼠标单击作为参数传递一样。您提供的只是一系列字符。
由于 Unix 和 C 是一起设计的,它也是 C 编程语言的一部分,从那里它进入了 C++、Java、Python 和大多数其他现代编程语言,并以同样的方式进入了 Linux、Windows 和大多数其他操作系统系统。