我知道在使用System.out.println()时,在Java等其他语言中;我把一个变量放在它里面就像一个int,它保存22号,它将22打印到控制台。
在C中如果我用printf()做同样的事情;我需要在字符串中指定类型,例如printf(“%d”,n);我也知道Java有自己的printf函数。
我想在这里得到的是C控制字符串与其他语言(如Java)相比如何工作,您不必在System.out.println()中提供类型标识符;它会自动识别变量是一个int。
这是C的效率方式的一部分,是否实际上没有检查类型并依赖程序员来理解他们提供的类型?
答案 0 :(得分:1)
事实上,printf
既不是有效的,也不是类型安全的数据写入方式。
由于格式字符串在编译时被解析并且在运行时选择了特定于类型的操作,因此存在性能损失,而在C ++和Java中,它可以在编译时完成。而且,变量参数被强制传递到堆栈上,这比在寄存器中传递它们效率低。
更重要的是printf
不是类型安全的。可以将任意类型的任意数量的参数传递给printf
,忽略格式字符串处方。当然,它很容易触发未定义的行为。
这种行为的唯一原因是C中没有函数重载。
另一方面,它并没有那么糟糕。首先,大多数编译器解析格式字符串,如果它与传递给printf
的参数不一致,则发出警告。其次,与推断出类型后格式化和打印文本的成本相比,上述性能损失实际上可以忽略不计。
答案 1 :(得分:0)
C的预定义数据类型(整数,字符等)以及用户定义的类型都不会在运行时携带类型信息。因此,如果在代码中使用4字节整数,则它在内存中仅占用4个字节(忽略对齐所需的任何填充)。这很有效率的原因,但这意味着需要通过格式/控制字符串告诉处理多种数据类型的函数(如printf)参数的类型是什么。
因此,当printf收到格式字符串“%d%f”时,它知道第一个非格式参数的类型是整数,第二个参数是float类型。
答案 2 :(得分:0)
通过在printf()中传递控制字符,我们告诉编译器如何分配内存以及我们想要打印的数据范围。
答案 3 :(得分:-1)
控制字符串也称为格式说明符。它们用于数据的格式化输入和输出操作。记忆格式说明符用于格式化数据。 例如,在printf()&中使用scanf()。scanf()中的控制字符串,用于以格式化的方式将数据传输到处理器存储器weather printf()将数据传输到输出设备,例如,以格式化的方式监视屏幕。 下面列出了一些常见的格式规范*。*。
FORMAT SPECIFIER :: DESCRIPTION
%c字符
%d签名整数
%e或%E科学记数法
%f浮点
%g或%G。类似于%e或%E
%喜。签名整数
%hu无符号整数(短)
%i签名整数
%l或%ld或%li签名整数
%lf浮点
%Lf浮点
%lu无符号整数
%lli,%lld签名long long int
%LLU。 unsigned long long int
‰。整数的八进制表示。
%p指向void void *的指针的地址 无效*
%s String char * %u Unsigned int
Unsigned short int
%n不打印
%%打印%字符
%o八进制表示
%p指向void void *的指针的地址 无效*
%s String char *
%u无符号整数
%x或%X十六进制表示形式 无符号的Int。
%n不打印
%%打印%字符
希望它能帮到你。