这是自己的一些总结
NSLog与printf的区别
(1)NSLog定义在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
(2)printf定义在stdio.h中,如下所示
_CRTIMP int __cdecl printf (const char*, ...);
_CRTIMP 是个宏定义,是下面的简写
C run time implement “C运行库的实现”的意思,个人理解就是标志此函数是个库函数。
int 表示返回值是int型。
__cdecl 是一个编译规则标志宏定义,给编译器看的,有了这个标志编译器在编译此函数时按照这个规范去编译。
printf是函数名。
const char*是printf函数的第一个参数,显然是指向“只读”字符的字符指针。
...表示不定长参数,即函数的参数个数是不确定的。__cdecl编译规则支持具有不定参数的函数。有了这个定义,我们在使用printf函数时才可以""后面的参数数目不等。
基本上,NSLog很像printf,同样会在console中输出显示结果。不同的是,传递进去的格式化字符是NSString的对象,而不是char *这种字符串指针。
(3)NSLog可以如下面的方法使用:
NSLog (@"NSLog test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 1, 2);
但是下面的写法是不行的:
int i = 1;
char a = 'c';
NSLog( @"%@ %@", i, a );
%@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成:
int i = 1;
char a = 'c';
NSLog( @"%d %c", i, a );
(4)printf 可以有如下面的方法使用:
printf(" test");
printf("%d", 1);
printf("%s", str); // str这里是定义的一个字符串;
但是没有%@
(5) NSLog的格式如下所示:
%@ 对象,%d, %i 整数,%u 无符整形,%f 浮点/双字,%x, %X 二进制整数,%o 八进制整数,%zu size_t%p 指针,%e 浮点/双字 (科学计算),%g 浮点/双字 ,%s C 字符串,%.*s Pascal字符串,%c 字符,%C unichar%lld 64位长整数,(long long)%llu 无符64位长整数,%Lf 64位双字。
(6)printf的格式如下所示:
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e.
%G 根据数值不同自动选择%f或%e.
%i 有符号十进制数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0f的无符号十六进制整数
%% 打印一个百分号 |