你可能从没见过的C语言冷知识

  以下都是我在备考过程中发现的一些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 类型表示弃置该值。

    头像
    CJHONG
      

    好怀念的#include哈哈,DNA动了。

    头像
    irils
      

    所以都快毕业了,还没加友链

    头像
    Vay
      

    虽然但是,“奇怪的零”那里%d不应该分别输出0和1嘛

      头像
      Veen Zhao
        
      @Vay

      C里没bool量,看懂即可

        头像
        @Veen Zhao

        C99 开始 C 语言有正式的 bool 类型,关键字为 _Bool。自 C23 起,bool 也作为布尔类型的关键字,true 和 false 成为 C 语言关键字,并且布尔类型不再由整数定义,而是由 true 和 false 两个常量定义。

          头像
          Veen Zhao
            
          @Coelacanthus

          大佬所言极是