4

【Clan1】基本数据类型、流程控制

 2 years ago
source link: https://www.guofei.site/2021/11/20/c.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【Clan1】基本数据类型、流程控制

2021年11月20日    Author:Guofei

文章归类: 语言    文章编号: 12001


版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2021/11/20/c.html

Edit

基础

gcc -o main main.c
# 然后执行 main 文件
./main

# (或者)编译+链接
gcc -o main.o main.c -c
gcc -o main main.o

include

#include <stdio.h> // 表示文件在系统目录下
#include "a.h" // 表示文件在当前目录下
  • main函数是执行的起点,有且只能有1个
  • printf 是向标准设备输出,未必是向屏幕输出,例如 ./main > save.txt
  • 建议用 int main,而不是 void main,后者不支持c++
  • 约定 return 0; 代表执行成功,return -1 代表执行失败
  • 预编译:把 include 替换进来,删除注释,等操作。gcc -o main1.c main.c -E
  • 汇编 gcc -o main.s main.c -S

基本数据结构

// 基本数据类型
void
char
int
float
double

// 修饰符
short // 短整形
long // 长整形
signed // 有符号
unsigned // 无符号

一个二进制位是一个bit,8 bit=1 Byte

c 本身不规定变量类型的范围,跟系统有关,我的 MacBook 如下:

修饰符 数据类型 占用(字节) 取值范围 signed short int 2 -32768 到 32767 (-2^15 ~ 2^15-1) int 4 -2147483648 到 2147483647 (-2^31 ~ 2^31-1) long int
long long int 8 unsigned short int 2 0 到 65535 (0 ~ 2^16-1) int 4 0 到 4294967295 (0 ~ 2^32-1) long int 8 float 4 1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38 duble 8 4.9E-324 ~ 1.7E+308, -4.9E-324 ~ -1.7E+308 char 1 -128~127 unsigned char 1 0~255

#include <stdio.h>
#include <float.h>

int main() {
  printf("int 存储大小 : %lu \n", sizeof(int));
  printf("a 存储大小 : %lu \n", sizeof(a));
  printf("float 存储最节数 : %lu \n", sizeof(float));
  printf("float 最小值: %E\n", FLT_MIN);
  printf("float 最大值: %E\n", FLT_MAX);
  printf("精度值: %d\n", FLT_DIG);

    return 0;
}
  • 原码:最高位0代表正,1代表负
  • 反码:如果是正数,反码和原码相同。如果是负数,符号位为1,其它各位与原码相反
  • 补码:正数与原码相同。负数:反码加一
    • 好处:相加不用再考虑正负
    • 负数补码转原码:符号位不动,其它求反,得到的数加一
    • 内存中以补码的形式存储
int a;
// 以 n 进制赋值
a = 10; // 默认十进制
a = 010; //0开头为8进制
a = 0b101; // 0b 开头为 2 进制
a = 0x2f;//    0x开头为16进制

// 以 n 进制显示
printf("十进制 = %d,八进制 = %o, "
       "十六进制小写 = %x , 16进制大写 = %X, "
       "十进制无符号 %u", a, a, a, a, a);


char c = 0x41;
printf("size = %lu, value= %c", sizeof(c), c);



float f = 123.4f;
double d1 = 100.1; // C语言默认都是 double


char ch = 'A';
printf("字符:%c,对应的ascii:%d\n", ch, ch);
int x = 1;
double y;
y = (double) x;

// char 的 \b 是退格符号,例如:
printf("hello word");
char b='\b';
printf("%c%c",b,b);
// 输出 hello wo


// 字符串 s/S char/wchar
printf("%s\n", "hello");


// p 16进制指针
int a = 1;
printf("%p\n", &a);

// 输出一个百分号
printf("%%", );

// printf 还有对其之类的操作,就不多写了

常量:不可被修改

// 宏常量,规范:用大写
#define MAX 100;

// const 常量
const int a = 0;
// c用宏常量多,C++用const多

"字符串常量"
20 // 整数常量

volatile,不让编译器自动做优化,例如:

int a =1;
a = a+1;
a = a+2;
// 以上代码会被编译器自动优化为: a = a+3

volatile int a = 1
// 编译器不会再自动做优化,

register:提升效率

register int a = 0; // 这个变量直接放在寄存器中,而不是内存中
a = a + 1;
// 对应汇编
move eax, 0
add eax, 1

// 普通的:
int a = 0;
a = a + 1;
// 对应汇编
move b, 0
move eax, b
add eax, 1
move b, eax
  • register 是建议型指令,而不是命令型的。如果寄存器不够用,register 可能不生效
  • 内存中连续的char,以 ‘\0’ 结尾
putchar('a') \\ 一次输出一个字符
printf("hello") \\ 不多说

getchar() \\ 返回 int,是你输入的字符对应的 ascii 码

// scanf:
int a;
scanf("%d", &a); // 第二个变量是变量的地址
printf("%d\n",a);

复杂类型

struct // 结构体
union // 共用体
enum // 枚举

typedef // 声明类型别名
sizeof // 得到类型大小,32位系统返回 unsigned int,64位系统返回 unsigned long
#include <stdio.h>

enum month {
    JAN = 1, FEB = 2, MAR = 3, APR = 4, MAY = 5, JUN = 6,
    JUL = 7, AUG = 8, SEP = 9, OCT = 10, NOV = 11, DEC = 12
};

int main() {
    enum month lastmonth, thismonth, nextmonth;
    lastmonth = APR;
    thismonth = MAY;
    nextmonth = JUN;
    printf("%d %d %d \n", lastmonth, thismonth, nextmonth);
    return 0;
}
  • 如果不定义值,第0个默认为0,后面的是前面的加1
    enum month {
      JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
    };
    

运算符

+-*/ 加减乘除
% 取模
i++ , i--  自加/自减

=,+=,-=,*=,/=,%= 赋值

int x, y, z;
x = y = z = 5; //为三个变量同时赋值

逻辑类,C语言没有bool类型,使用 0/1 类型

// 比较运算符,返回0或1
==,!=,<,>,<=,>=

// 逻辑运算符,与或非
&&,||,!

// 三目运算符
max = x > y ? x : y;
  • 逻辑运算符不会做额外运算,例如:x>3   x/0 不会报错

位运算符

& 按位与
| 按位或
~ 按位反
^ 按异或

<< 移位
>> 移位

存储相关

auto
static
register
extern
const
volatile

流程相关

return
continue
break
goto
if (/* condition */) {
  /* code */
}


else


switch (/* expression */) {
  case /* value */:
}


default
for (size_t i = 0; i < count; i++) {
  /* code */
}


do {
  /* code */
} while(/* condition */);


while (/* condition */) {
  /* code */
}

标准库

system

#include <stdlib.h>

int main()
{
    system("ls -l"); // 运行成功返回0
    return 0;
}

system 返回什么?

  • 被调用者的返回
  • 如果调用 linux 命令,成功返回0
  • 如果调用其它编译好的 another.c,返回 another.c#main 函数的 return (???并不是)

您的支持将鼓励我继续创作!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK