程序员——C语言之函数、进制、数组、字符串易错知识点



1.函数

 1.函数返回值

返回值类型 函数名(形式参数列表)

{

        函数体

}

  •  void可以省略return,如 void test(){…}表示没有返回值return后面不能带返回值,return也可省略掉。
  •   如果没有写返回值类型,默认是int,如sum(int a, int b) {int c = a + b;}
  •  如果写了返回值类型,可以不返回任何值



2.函数注意

  • 不能嵌套定义函数(不能在函数里再定义函数)
  • 不能重复定义、可以重复声明
  • 调用函数之前,(尤其是调用函数的定义在后面时)一定要函数声明,一般声明放在最前面

3.printf()函数

  • 需要#include <stdio.h>
  • 返回值:字符串的长度

笔记:

转义字符占据一个字符长度

1.\n换行  2. \t tab  3.  \” 一个双引号

4.printf函数返回的字符串常量的字符数,并非字数

5.一个汉字占据3个字符。

int e = printf("哈h\"\ta\n");

printf("e=%d\n", e);
如上代码,运行结果e=8


4. #include

  • 作用:拷贝右边文件的所有内容到#include所在的位置
  • 自定义的文件用””,系统自带的文件用<>


2.进制


  1.  printf以不同进制形式进行输出

%d%i十进制形式输出整数

%c 输出字符(char

%p 输出地址

%f 输出小数

%o 八进制形式输出整数

%x 十六进制形式输出整数

  • 2.取值范围

二进制最高位只是用来当正负符号位,因此int正数范围1~231- 1


3 类型说明符long /short/signed/unsigned int 


1>    signed int等价于signed 取值范围是-231 ~ 231- 1,unsigned int等价于unsigned 取值范围是0 ~ 232– 1

2>    signedunsigned的区别就是它们的最高位是否要当做符号位,并不会像shortlong那样改变数据的长度,即所占的字节数。

3>    shortlong改变数据所占字节数,signedunsigned改变int取值范围。


4 位运算

& 按位与

  1.  只有对应的两个二进位均为1结果位才为1,否则为0。
  2.  举例:比如9&5,其实就是1001&101=1,因此9&5=1
  3. 规律:二进制中1&就保持原位0&就为0

| 按位或

  1. 只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
  2. 举例:比如9|5,其实就是1001|101=1101,因此9|5=13

 

^ 按位异或

  1. 当对应的二进位相异不相同结果为1,否则为0。
  2. 举例: 比如9^5,其实就是1001^101=1100,因此9^5=12
  3. 规律:
  • 相同整数相^的结果是0比如5^5=0
  • 多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6
  • 0与任何整数异或仍是整数本身。
  • 因此得出结论a^b^a = b

 

~ 取反

对整数a的各二进位进行取反,符号位也取反(0变1,1变0)

如~9,0000 0000 0000 0000 00000000 0000 1001取反为

11111111 1111 1111 1111 1111 1111 0110为-10

 

<< 左移

  • 把整数a各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2n次方
  • 由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
  • 9<<n计算结果等于9*2的n次方,计算效率前者要比后者高

>> 右移

  • 把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2n次方
  • 为正数时, 符号位为0,最高位补0
  • 为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
位运算练习:

<span style="font-size:10px;">#include <stdio.h>

/*
 使用位异或运算符交换两个变量的值
*/

 int main()
 {
 	int a = 10;
 	int b = 11;

 	// 使用位异或运算
 	a = a ^ b;
 	b = a ^ b;
 	a = a ^ b;
 	
 	printf("a=%d,b=%d\n", a, b);

 	return 0;
 }</span>

#include <stdio.h>
/*
 用位与&运算符判断变量的奇偶性
 */
int main()
{
    /*奇数末尾是1
     15: 1111
     9:  1001
     
     偶数末位是0
     14: 1110
     10: 1010
     */
    int a = 15;
    
    a&1 == 1 // 奇数
    a&1 == 0 // 偶数
    
    /*
    if (a%2) {
        printf("奇数\n");
    } else {
        printf("偶数\n");
    }*/
    
    //a%2==0?printf("偶数\n"):printf("奇数\n");
    
    //a%2?printf("奇数\n"):printf("偶数\n");
    
    return 0;
}

<span style="font-size:14px;">/*
写一个函数,用来输出整数在内存中的二进制形式
*/

#include <stdio.h>
void printBinary(int number);

int main()
{
    /*
     0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 1111
     
     9 : 0000 0000 0000 0000 0000 0000 0000 1001
     -10 : 1111 1111 1111 1111 1111 1111 1111 0110
     */
    
    //printf("%d\n", ~9);
    
    printBinary(-10);
    return 0;
}

void printBinary(int number)
{
    // sizeof()返回字节数 int 占4个字节
    // 记录现在挪到第几位
    // (sizeof(number)*8) - 1 == 31 总共的位数-1 
    int temp = ( sizeof(number)<<3 ) - 1;
    //<span style="font-family: Arial, Helvetica, sans-serif;">  </span></span>通过右移的方法,使二进制每一位移到最右,和1作位与运算,来获得每一位的值<span style="font-size:14px;">
    while ( temp >= 0 )
    {
        // 先挪位,再&1,取出对应位的值
        int value = (number>>temp) & 1;
        printf("%d", value);
        temp--;
        
        // 每输出4位,就输出一个空格
        if ( (temp + 1) % 4 == 0 )
        {
            printf(" ");
        }
    }
    
    printf("\n");
}</span>

5 char类型

char类型占一个字节,8bit,所以取值范围是2的8次方即

-128~127范围内,可以当做整数来用

printf(“%d”, ‘A’);  // %d 输出返回是整数类型 67,即’A’的ASCII值为10
printf(“%c”, 68);  // %c输出返回是字符型,B

常见错误:

char c = '男'; 汉字占3个字节,单引号’’只能扩住单字节的字符。
char c = A;//此处A会被当成变量
char c = "A";//字符串不能给char
char c = 'ABCD';

转义字符均占一个字节数

转义字符

意义

ASCII码值

\n

将当前位置移到下一行开头(回车换行)

10

\t

跳到下一个TAB位置

9

\\

代表一个反斜线字符

92

\'

代表一个单引号字符

39

\"

代表一个双引号字符

34

\0

空字符

0


char类型可以当做整数型int来用,如下

int i = 67 + '4';//67+52=119
char c = 'c' - 10;//99-10=89
   
printf("%d -%c\n", i, i);//119 – w
printf("%d -%c\n", c, c);//89 - Y


6 数组

数组定义

// 简单初始化:
int ages[5] = {19, 19, 20, 21,25};  //注意是大括号{}
int a[3] = {10, 9, 6};
int a[3] = {10,9};
int a[] = {11, 7, 6};
int a[4] = {[1]=11,[0] = 7}; //较少用,指定位置赋值
int count = 5; 
  int ages[count]; 
  ages[0] = 10; 
  ages[1]= 11;
//数组[]长度用变量定义时,只可定义,不能同时初始化。int ages[count] = {10,22,31};错误。

常见错误

int a[]; //只定义数组名,没有指定个数。编译报错
a[4] = {10,9,8,5};//没有指定数组类型,报错。
int a[5];  a = {1,2,3,4,5};//报错。只能在定义数组的同时进行初始化。
int count = 5;  intages[count] = {10,22,31};//报错。如果想在定义数组的同时进行初始化,数组元素个数必须是常量,或者不写。

数组长度

由于c语言是面向程序,不是面向对象,所以数组长度不能用array.length来表示。

正确写法是:int ages[] = {10,11,13,76};  int length=sizeof(age)/sizeof(int);

内存分析

  • 存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)
  • 数组名的作用,用于查看元素地址

数组作为函数参数

  1. 数组作为函数参数,可以省略元素个数
  2. 数组作为函数参数,传递的是整个数组的地址,修改函数形参数组元素的值,会影响到外面实参数组。
  3. 数组当做函数参数传递时,会当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节。所以在函数里不能求数组的长度int length = sizeof(Array)/sizeof(int);。数组长度需要当做参数传进来。




7 字符串

多个字符组合在一起就是字符串

  • “123”其实是由’1’、’2’、’3’、’\0’组成
  • 字符串的输出”%s”’\0’是不会输出的


    strlen(注意中文)输出字符串的长度,不包含\0。中文占3个字符。

    字符串的本质,就是多个有顺序的字符,拼接组成。


    字符串数组

    一维字符数组中存放一个字符串

    二维字符数组可以存储多个字符串






    • 0
      点赞
    • 5
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值