暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C语言基础语法第一天

瓶子的跋涉 2022-12-30
253
目录:
  • C语言预备知识
  • C语言标准函数
  • 编译过程
  • 变量
  • IEE754
  • 运算
  • 解一元二次方程练习
C语言预备知识:
C语言标准函数库
编译过程
  • 预处理(Preprocessing):用于将所有的#include头文件以及宏定义替换成真正的内容。gcc的预处理是预处理器cpp来完成的。

X
文件名
文件大小
代码行数




预处理前
test.c
146B
9
预处理后
test.i
17691B
857

  • 编译(Compilation):将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。

  • 汇编(Assemble): 将上一步的汇编代码转换成机器码(machine code)产生目标文件

  • 链接(Linking):链接过程将多个目标文以及所需的库文件链接成最终的可执行文件(executable file)


数据类型

变量(Variable):表示内存中的一个存储区域(不同的数据类型,占用的空间大小不同)
变量的初始化(initialized)就是变量赋值
类型
英文表示
存储字节
整型
int
4
短整型
short int
2
长整型
long int
8
单精度浮点数
(6位小数)
float
4
长精度浮点数
(15位小数)
double
8
字符
char
1
C语言中没有字符串类型,使用字符数组char[]表示字符串
变量类型
生存周期
作用域



局部变量
auto:自动变量,离开定义函数立即消失
只作用于该函数内部
register:寄存器变量,离开定义函数立即消失
static:静态变量,离开定义函数仍然存在
全局变量
在程序运行期间一直存在
static:静态变量,仅限于本文件内部调用
extern:外部存储变量,用于声明本文件将要用到的其他文件的变量
进制注意事项:
    C语言规定八进制前加0,十六进制前加0x或0X,十进制前什么也不加
    在汇编中:数字后加字母B表示二进制(binary),加字母o表示八进制数(octonary),加字母D表示十进制数(decimal system),加字母H表示十六进制数(hexdecimal)
    printf的用法
  • %d表示十进制输出

  • %x或%X表示以十六进制输出

  • %o表示以八进制输出


浮点数的写法:
    float x = 3.2 ;//传统写法
    float x = 3.2e3 ;//科学计数法3200
    float x = 123.45e-2;  //科学计数法 1.2345 (后者默认double)
    字符
    • 单个字符使用单引号括起来'A'

    • 字符串用双引号括起来:“A” 表示 ‘A’和‘\0’的组合


    存储方式
    整数是以补码的形式转化为二进制补码的形式存储在计算机中
    实数是以IEE754标准转化为二进制代码存储在计算机中的
    字符实质上与整数的存储方式相同
    const修饰常变量:值不能被修改,在整个作用域中都维持原值
      int main()
      {
        const int a = 1;  //a的值不允许修改
      }
      #define定义的标识符常量
          该标识符常量在程序中是个定值,通常用于表达数组容量或涉及数学的常量。
        ***#define***
        #define SIZE 10



        • sizeof运算符: 用于获取数据类型或者表达式的长度


          sizeof(变量名)
          sizeof(数据类型名)
          sizeof 变量名
          注意
          •  sizeof(结构体) :理论上结构体各个成员在内存中是连续存放的,和数组非常类似,但是,结构体占用的总大小不一定等于全部成员变量占用内存大小之和。在编译过程中,为了提高内存寻址的效率,各个成员之间可能会存在缝隙,用sizeof可以得到结构体在内存中的总大小,sizeof(结构体名)或sizeof(结构体变量名)都可以。

          • 不要对void使用sizeof: void是无值型或空类型,不知道存储空间大小的类型,编译器也不能确定它的大小。

          • 不要在子函数中对字符指针用sizeof:如果在子函数中用sizeof(pstr),得到的不是字符串占用内存的字节数,而是字符指针占用内存的字节数(8字节)

          • 不要在子函数中对结构体指针用sizeof :同字符指针


          • signed :第一位代表正负,剩余代表大小 signed  int范围-128~127,默认情况

          • unsigned:无符号,所有位都为大小,没有符号 unsigned int 范围0~255


          数据类型
          字节数
          取值范围
          char
          1
          -128~127
          unsigned char2
          1
          0~255
          short
          2
          -32768~32767
          unsigned short
          2
          0~65535
          int
          4
          -2147483648~2147483647
          unsigned int
          4
          0~4294967295
          long
          4
          -2147483648~2147483647
          unsigned long
          4
          0~4294967295
          long long
          8
          -9223372036854775808~9223372036854775807
          unsigned long long
          8
          0~18446744073709551615

          数据类型
          字节数
          取值范围(绝对值)
          float
          4
          1.17549*10^-38~3.40282*10^38
          double
          8
          2.22507*10^-308~1.79769*10^308
          long double
          12
          2.22507*10^-308~1.79769*10^308


          代码规范化: 《高质量c语言编程》 林锐
          redefinition :重复定义
          multiple:多种的,多重
          initialization :初始化
          ASCII编码:

          scanf补充:
            int main()
            {
            char ch;
              scanf("m%c", &ch);  //输入ma       //m为非输入控制符
            printf("%d\n", ch);
            return 0;
            }
            //输出97
            多个scanf读取数据:读取中间非法输入(脏数据)
              #define _CRT_SECURE_NO_WARNINGS
              #include <stdio.h>


              int main()
              {
              int a , b;
              char ch;//存放脏数据
              scanf("%d", &a);
              printf("%d\n", a);
              避免第一次输入的脏数据影响第二次读入
              如果第一次后面存在脏数据将其读入
              while ((ch = getchar()) != '\n')
              {
              continue;
              }
              scanf("%d", &b);
              printf("%d\n", b);
              return 0;
              }

              赋值运算符
              说明
              示例



              =
              普通赋值运算符
              val = 2
              +=
              加并赋值操作
              val += 2 等价于 val = val + 2
              -=
              减并赋值操作
              val -= 2 等价于 val = val - 2
              *=
              乘并赋值操作
              val *= 2 等价于 val = val * 2
              /=
              除并赋值操作
              val = 2 等价于 val = val 2
              %=
              取余并赋值操作
              val %= 2 等价于 val = val % 2
              <<=
              左移并赋值操作
              val <<= 1 等价于 val = val << 1
              >>=
              右移并赋值操作
              val >>= 1 等价于 val = val >> 1
              &=
              按位与并赋值操作
              val &= 1 等价于 val = val & 1
              ^=
              按位异或并赋值操作
              val ^= 1 等价于 val = val ^ 1
              |=
              按位或并赋值操作
              val |= 1 等价于 val = val | 1
              注意
              •     取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同。

              • C语言没有“之间”,“中间”,“之内”的关系运算符,只能使用与或操作进行替换

              优先级
                  算术 > 关系 > 逻辑 > 赋值
              注意:C语言对真假的处理
                  非零是真
                  零是假
                  真用1表示,假用0表示
                变量名++;// 表示在本次使用变量后再自增;
                ++变量名; 表示在本次使用变量前自增;
                变量名–-;// 表示在本次使用变量后再自增;
                –-变量名; 表示在本次使用变量前自减;

                逗号也是运算符:
                  #include <stdio.h>
                  int main()
                  {
                  3, 4, 5;//这是一条语句
                  //把上面这条语句的值赋值给变量a
                  int a = (3, 4, 5);
                  printf("a=%d\n", a);
                  }


                  //输出结果:a=5
                  // 因为a的值是整条语句的值,而整条语句的值是最后那个逗号后面的值

                    #include <stdio.h>
                    int main()
                    {
                    int a=3, b=4, c=5;
                    int x=0;
                      int y=(x=a+b),(b+c);     // 使用逗号隔开,使得y=x=a+b
                    printf("第一个y=%d\n", y);
                      y=((x=a+b),(b+c));      
                       // 如果用逗号二开,返回值就会变成最后那个表达式额值
                      printf("第二个y=%d\n", y);
                    }


                    // 输出结果:
                    // 第一个y=7
                    //     第一个y=9

                    三目运算符:
                      表达式1?表达式2:表达式3;
                      先执行表达式1,如果表达式1的结果为真,那么执行表达式2,整体的运算式的结果是表达式2的结果。如果表达式1的结果为假,则执行表达式3,结果也为表达式3的结果。

                      练习:解一元二次方程(C语言)
                        #define _CRT_SECURE_NO_WARNINGS 
                        #include<stdio.h>
                        #include <math.h>
                        //一元二次方程
                        int main()
                        {
                        int a; //二次项系数
                        int b; //一次项系数
                        int c; //常数项
                        printf("请分别输入二次项系数,一次项系数,常数(中间空格隔开)\n");
                        scanf("%d %d %d", &a, &b, &c);
                        float judge; //根据b的平方-4ac来判断是否有解及解的个数
                        judge = b * b - 4 * a * c;
                        printf("%f\n", judge);
                        float x1, x2; // 方程的解
                        if (judge < 0)
                        {
                        printf("此方程无解\n");
                        }
                        else if (judge > 0)
                        {
                        printf("此方程有两个不同的解\n解为:\n");
                        x1 = (-b + sqrt(judge)) / 2 * a;
                        x2 = (-b - sqrt(judge)) / 2 * a;
                        printf(" X1:%f\n X2: %f\n", x1, x2);
                        }
                        else if(judge == 0)
                        {
                        printf("此方程有两个相同的解\n");
                        x1 = (-b - sqrt(judge)) / 2 * a;
                        x2 = (-b + sqrt(judge)) / 2 * a;
                        printf(" X1=X2: %f", x1);
                        }
                        return 0;
                        }

                        参考资料郝斌老师C语言
                                        《算法设计与分析》第二版
                                        C语言技能树

                        文章转载自瓶子的跋涉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论