以下都是我在备考过程中发现的一些C语言冷知识,可能会比较有趣或者怪异,分享给大家看一下,有些的确很冷 ::(狗头)。
奇怪的零
看下面的代码,请问输出什么?这是我在今年计算机二级考试的时候碰到的一道类似的题。[DarkBText]别问我为啥都要毕业了才考二级C[/DarkBText]。
#include <stdio.h>
int main(){
printf("%d\n", 0=='0');
printf("%d", 0=='\0');
return 0;
}正确答案是:[BlurText]第一个输出false,第二个输出true[/BlurText]。
实际上,'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);
}