C数据类型及语句

1  关键字

1.1 数据类型相关的关键字

  char:字符型,占1字节。

  short:短整型,占 2 个字节。

  int:整型,在 32 位系统下占 4 个字节,在 16 平台下占 2 个字节。

  long:长整型,32 位系统下占 4 个字节。

   float:单浮点型,占 4 个字节。

  double:双浮点型,占 8 个字节。

  struct:定义结构体。

  union:定义共用体。

  enum :定义枚举类型。

  signed:有符号。

  unsigned:无符号。

  void:(1)空类型,不能定义变量,没有 void 类型的变量。

     (2)void 是用来修饰函数的参数或者返回值,代表函数没有参数或没有返回。

1.2 存储相关关键字

  register:(1)修饰寄存器变量,编译时尽量分配在寄存器空间,不一定真的存放在寄存器中。

       (2)不能对变量取地址。

       (3)register 只能修饰字符型及整型的,同时不能定义数组,空间宝贵。

       (4)cpu 取寄存器数据比去内存中拿数据要快。

  static:静态,可以修饰全局变量、局部变量、函数。

  const:修饰常量,只读。

注:(1)如果以常量初始化 const修饰的只读变量,那么只读变量的值事先存放在“符号常量表中” 不会立即给data开辟空间,当对data取地址时,系统才会为data在内存中开辟空间。

                  

// C++代码,在qt编译结果
#include <iostream> using namespace std; void test() { const int num = 10; int* p = (int*)&num; *p = 20; cout<<num<<endl<<*p; // num =10,(还是取的符号常量表里的值); *p = 20; } int main(int argc, char *argv[]) { test(); return 0; }
// c语言在vscode上编译结果,结果与上面不一致
#include<stdio.h> #include<string.h> #pragma warning(disable:4996) void test() { const int num = 10; int* p = (int*)&num; *p = 20; printf("%d\n", num); // num = 20 printf("%d\n", *p);// *p =20 } int main() { test(); return 0; }

  (2)如果以变量初始化 const修饰的只读变量 那么只读变量会立即开辟空间(没有符号常量表)

#include <iostream>
using namespace std;
void test()
{
    int a = 10;
    const int num = a;// 以变量初始化 const修饰的只读变量,只读变量会立即开辟空间,没有符号常量表
    int* p = (int*)&num;
    *p = 20;
    cout<<num<<endl<<*p; // num =20;*p = 20;
}
int main(int argc, char *argv[])
{
    test();
    return 0;
}

  (3)const修饰自定义类型变量 (比如结构体,类对象)立即开辟空间 (没有符号常量表)。

  extern:外部的,一般用于函数和全局变量的声明。

1.3 控制语句相关的关键字

if选择语句:

if(条件表达式)
{     
    语句1;
    ...
}
else
{   
    语句1;
    ...
 }

switch 语句:

int n;
printf("请输入一个 1~7 的数\n");
scanf_s("%d",&n);
switch(n)  // n必须为一个整型或枚举类型
{
    case 1:
       printf("星期一\n");
       break;
    case 2:
        printf("星期二\n");
        break;
    default:
        printf("您的输入有误,请输入 1~7 的数\n");
        break;
}

for 循环:

int i,sum=0;
for(i=0;i<10;i++)
{
     sum = sum +i;
}

while循环:

int i=1;
int sum=0;
while(i<10)
{
    sum = sum +i;
    i++;
}

do-while循环

int i=1;
int sum =0;
do
{
   sum = sum+i;
   i++;
}while(i<10)

  注:continue:结束本次循环,进入下一次循环

1.4 其他关键字

  sizeof:计算变量、数组的占用存储空间的字节数。

int a = 10;
int num;
num = sizeof(a);

  typedef:起别名。

// 起别名步骤
int a; 
int INT32;
typedrf int INT32;// 熟悉之后,前面的步骤都可以省略
INT32 b; // 等价于 int b;

  #define:定义一个标识符来表示一个常量。标识符不占内存,只是一个临时的符号,预编译后就不存在。

#define  NUM  10  // 无分号结尾,只能宏定义常量。

  volatile:易改变的,cpu每次重新去内存取值,不使用寄存器中的备份。

volatile int a =10;

2 数据类型

2.1 基本类型

  char 、short int 、int、long int、float、double。

  注释:

  1. char:(1)存放的是字符对应的ASCII值。

         (2)‘a’与“a”的区别:‘a’为字符常量,“a”为字符串常量,“a”包含两个字符‘a’和’\0’,编译器自动添加’\0’。

                     

2.2 类型转换

    (1)自动转换:低字节=>高字节,保证精度不降低。

                     

      注:(1) 表达式中出现了 char 、short int 、int 类型中的一种或者多种,无其他类型了,全部转化为int参与运算,结果也是int型。

          (2) 有小数,全部转化为double 类型的参加运算。

          (3) 有符号和无符号参与运算,有符号变成无符号参与运算(表达式中无浮点数)。

#include <stdio.h>
int main(void)
{
   short  a = -8;
   unsigned short b=7;
    if(a+b>0)
    {
         printf("a+b>0\n");// 输出
    }
     else
    {
         printf("a+b<=0\n");
    }
    printf("%x\n",(a+b)); // oxffffffff(补码):short运算转化为int了。
printf(
"%d\n",(a+b)); return 0; // -1 : %d输出为有符号数,就是ffffffff的原码值,
}

          (4) 赋值语句中等号右边的类型自动转换为等号左边的类型。

          (5) 自动类型转化不会影响变量的类型和值,只是在运算过程中临时性转换。

  

 

posted @ 2023-05-17 11:48  小伟学C  阅读(19)  评论(0)    收藏  举报
levels of contents