1.printf返回值:
成功:返回打印字符的个数
失败:返回EOF,EOF是文件结束的标志,宏定义为-1
#include <stdio.h>
int main() {
char str[] = "123456789";
printf("%d\n", printf("%d\n", printf("%s\n", str)));
return 0;
}
最内部printf打印“123456789\n”,共10个字符,返回值为10,通过第二个printf打印出来,以此类推。
2.scanf
成功:返回成功输入的个数,可能为0
失败:返回EOF,EOF是文件结束的标志,宏定义为-1
#include <stdio.h>
int main() {
int a = 0, b = 0;
printf("scanf返回值=%d\n", scanf("%d %d", &a, &b));
printf("a=%d\nb=%d", a, b);
return 0;
}
因此可以书写以下类型的代码:
#include <stdio.h>
int main() {
int a;
char arr[10] = { 0 };
while (scanf("%d %s", &a, arr)==2){
printf("%d %s\n", a, arr);
}
return 0;
}
3.sizeof返回值
sizeof的返回值是size_t类型,是无符号整形,代表占内存的大小,单位是字节。
size_t 是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t 可能不一样。size_t在32位系统上定义为 unsigned int,也就是32位无符号整型。在64位系统上定义为 unsigned long ,也就是64位无符号整形。size_t 的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。
推荐用%zu打印,%u和%lu有时候也是可以的。
#include <stdio.h>
int main() {
char a[] = "123456789";
char* p = a;
printf("%zu", sizeof(p));
return 0;
}
4.[ ]下标引用操作符
#include <stdio.h>
int main() {
char a[] = "123456789";
printf("%c\n", a[5]);
printf("%c\n", 5[a]);
printf("%c\n", *(&a[0] + 5));
printf("%c\n", "123456789"[5]);
printf("%c\n", 5["123456789"]);
printf("%c\n", *("123456789"+5));
return 0;
}
乍一看,这玩意是什么,好诡异的代码。首先你要搞明白[ ]的意思。
定义字符串两种方式:
char* p="123456789"
char a[]="123456789"
两种都可以定义字符串,当输出字符串中的某一个字符时:
*(p+i);
a[i]
两者是等价的,所以*(a+i)=a[i]
下面给出 [ ] 操作符的定义:
1.定义数组时,向编译器申请一段连续的空间。
2.指针[ i ] 表示以指针当前位置为起点,向后跳过i个该指针所指类型的大小的空间。
3.p[q] 等价于 *(p+q),若pq都不是指针则会报错!\n根据第三条,我们可以写出这样的代
5.{ }和[ ]的替代
在某些编译器下,比如是dev 5.11下我们可以使用<:和:>代替 [ 和 ] ,用<%和%>代替 { 和 }。
#include <stdio.h>
int main()
<%
char a<::>="abcdefghigk";
printf("%s",a);
return 0;
%>
6.字符串拼接
由“” 包围的字符串放在一起,会自动拼接一个字符串;
#include <stdio.h>
int main() {
char* str = "aaaa""bbbb"\
"cccc";
printf("%s", str);
return 0;
}
今日太晚,明日继续更新,请大家持续关注!!!!!