以下都是我在备考过程中发现的一些C语言冷知识,可能会比较有趣或者怪异,分享给大家看一下,有些的确很冷 。
奇怪的零
看下面的代码,请问输出什么?这是我在今年计算机二级考试的时候碰到的一道类似的题。别问我为啥都要毕业了才考二级C。
#include <stdio.h>
int main(){
printf("%d\n", 0=='0');
printf("%d", 0=='\0');
return 0;
}
正确答案是:第一个输出false,第二个输出true。
实际上,'0'
表示的是字符0,对应的ASCII码是48,48对应的十六进制数就是0x30
。而'\0'
是转义字符,代表空字符,对应的ASCII码是0,0不管是几进制,都是0(十进制),也就是0x00
(十六进制)。
反斜杠\
当我们一行写不下一条C语言语句时,可以使用续行符 '\'
来续行。
printf("Hello \
World!");
输出的结果为Hello World!
。但是在一行的代码中使用它。如:
printf("Hello \World!");
这里会输出什么呢?要注意,输出结果中并没有'\'
。也就是说,在C语言编译器里面,当使用单独的一个 '\'
时他就是一个续行符,哪怕这个续行是在一行也是一样。
另类数组写法
C语言中是数组元素的引用的一般形式是:数组名[下标]
;比如Array[3]
。
实际上也可以写成:下标[数组名]
。例如下面的代码。
#include <stdio.h>
int main(){
int arr[10];
arr[5] = 1;
printf("%d",5[arr]);
}
依然可以输出数组下标为5的元素。
[]和{}符号的替换
说到这个就不得不提一嘴IBM的历史。早期 IBM 在计算机产业中的地位非常重要,但是它的键盘没有中括号和花括号按键,所以在C语言中可以使用其它的组合符号来替代,并且一直保留到现在。
我们可以使用<:
和:>
来代替[
和]
,使用<%
和%>
来替换{
和}
。比如下面的代码可以正常编译并运行:
#include <stdio.h>
int main(void)
<%
int arr<:5:> = {1, 2, 3, 4, 5};
printf("%d\n", 2<:arr:>);
return 0;
%>
字符串拼接
将两个由" "
包围的字符串放在一起,它们会自动拼接成一个字符串,请看下面的代码:
#include <stdio.h>
int main(void){
printf("C" "C++" "Python");
}
最终会打印:CC++Python
,注意没有空格哦。
忽略参数的处理
有时候不需要处理函数调用传进来的一些参数,但如果放置没有用的参数不管可能会引起编译警告甚至错误,这个时候就需要手动指定忽略参数的处理,可以看下面的例子:
void func(int n, int m) {
(void)m; // 忽略参数m
printf("%d\n", n);
}
数组另类写法那个是因为 a[x] 实际上是 *(a+x) 的语法糖。C 语言里将一个变量转为 void 类型表示弃置该值。
好怀念的#include哈哈,DNA动了。
所以都快毕业了,还没加友链
虽然但是,“奇怪的零”那里%d不应该分别输出0和1嘛
C里没bool量,看懂即可
C99 开始 C 语言有正式的 bool 类型,关键字为 _Bool。自 C23 起,bool 也作为布尔类型的关键字,true 和 false 成为 C 语言关键字,并且布尔类型不再由整数定义,而是由 true 和 false 两个常量定义。
大佬所言极是