C 控制字符串?

标签 c string controls

我知道在其他语言(例如 Java)中,当我使用 System.out.println();我在其中放置了一个变量,就像一个保存数字 22 的 int 变量,它会将 22 打印到控制台。

在 C 语言中,如果我用 printf() 做同样的事情;我需要指定字符串中的类型,例如 printf("%d", n);我还知道Java有自己的printf函数。

我在这里试图了解的是,与其他语言(例如 Java)相比,C 控制字符串是如何工作的,在 Java 中,您不必在 System.out.println() 中提供类型标识符;它会自动识别该变量是 int。

这是 C 效率方式的一部分吗?它实际上并不检查类型并依赖程序员来理解他们提供的类型吗?

最佳答案

事实上,printf 既不是高效的数据写入方式,也不是类型安全的数据写入方式。

存在性能损失,因为格式字符串是在编译时解析的,并且类型特定的操作也是在运行时选择的,而在 C++ 和 Java 中,它可以在编译时完成。此外,可变参数被迫在堆栈上传递,这比在寄存器中传递它们的效率低。

更重要的是 printf 不是类型安全的。可以将任意数量、任意类型的参数传递给 printf,忽略格式字符串规定。当然,它很容易触发未定义的行为。

出现这种行为的唯一原因是 C 中没有函数重载。

另一方面,情况并没有那么糟糕。首先,大多数编译器都会解析格式字符串,如果它与传递给 printf 的参数不一致,则会发出警告。其次,与推导类型后格式化和打印文本的成本相比,上述性能损失实际上可以忽略不计。

关于C 控制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26397184/

相关文章:

java - 如何用C、C++、Java等语言动态生成HTML?

C 程序无法访问 textile

java - 拆分并分配一个以空格作为分隔符的字符串

java - 用 "Enter"分割字符串

java - 将字符串与文本进行匹配并存储下一个文本

asp.net - 找到多个具有相同 ID 'add0' 的控件。 FindControl 要求控件具有唯一 ID

javascript - 清除输入文本AngularJS

c - 动态创建线程并传递一个整数

wpf - 为所有相同类型的控件设置一个事件

c - 将一个txt文件读入单链表。并打印列表