c的基本知识:基本数据类型和控制语句


一、程序是如何运行的

我们知道计算机只识别0,1,那么当我们把程序编写完成后,计算机是如何运行这个程序的呢?

在ANSI C的任何一种实现中,存在两种不同的环境,第一种是翻译环境,在这个环境中源代码就会被转换为可执行的机器指令;第二种就是执行环境,它用于实际执行代码。而这两种环境不需要运行在一台机器上。

1. 翻译环境

翻译其实就是程序的编译,这往往有几个步骤组成。

第一步:预处理器阶段处理,在这个阶段预处理器在原代码上执行一些文本操作,如读入头文件,用实际值代替由# define定义的符号等。

第二步:解析阶段,也是产生绝大多数错误和警告信息的地方,随后就会产生目标代码,目标代码就是机器指令的初步形式。

2. 执行环境

程序的执行也需要经历几个阶段。

第一步:程序载入内存中,在具有操作系统的环境中(宿主环境)由操作系统来将其载入内存,那些不是存储在栈堆中尚未初始化的变量将会在这个时候得到初始值。若是独立环境(即没有操作系统),就需要手动安排。

第二步:开始执行程序(准备工作)。在宿主环境中,通常由一个小型的启动程序和程序链接在一起。接着,调用main函数。

第三步:执行程序。在绝大多数机器中,程序将使用一个运行时的堆栈,用于存储函数的局部变量和返回地址。程序同时可以使用静态内存,存储在静态内存中的变量在程序的整个执行过程中将一直保留它们的值。

第四步:程序的终止。可能有不同原因引起的程序的终止,正常终止就是指main函数正常返回,也有可能因为执行过程中的错误自行中断。

二、hello world(实例代码的运行)

1. 编写代码

代码如下(示例):

#include <stdio.h> //引用头文件

int main()//编写主函数
{
    printf("hello world");//输出语句
}

<stdio.h>是一个标准输入输出的头文件,在我们的代码中的输出printf,所以必须引用这个头文件。每个程序必须有一个主函数,也就是main函数,程序的运行顺序主要由main函数中的代码自上而下运行的。最终的printf语句就是一个标准输出语句,格式就是printf("输出内容");,需注意每个语句都必须以分号结尾,表示一个语句的结束。

其次为了代码的可读性,我们往往会在代码中增添注释,可以使用//进行单行注释,或者使用/*开头和*/结尾来进行多行注释。

三、数据类型

在c语言中有4中基本数据类型:整型,浮点型,指针和聚合类型。其中指针和聚合类型我们下一次在具体看这部分的内容。

整型中包括字符,短整型,整型和长整型,其中短整型至少16位,长整型至少32位,缺省的整型往往由编译器决定其是16位还是32位,通常是该机器最自然高效的位数。字符型在本质上是一种小整型,缺省的char要么是signed char要么是unsigned char 这往往也取决于编译器,所以,只有当程序中所使用的char值位于这两种字符型的交集中,才能具有良好的可移植性。(或者,我们为了拥有良好的可移植性,可以显性的定义为signed char或者unsigned char,但这往往会收机器兼容性等的影响,使得这种统一显性的声明并非是上上之策)。

浮点型包括float,double,long double类型,通常这些类型分别提供单精度、双精度和某些支持扩展精度的机器上提供扩展精度,所以的浮点类型必须能容纳从10^-3710^37之间的任意数。

#include <stdio.h>

int main() {
  printf("%c\n",'a');  //字符型 使用printf语句输出时为%c
  printf("%d\n",123);  //整型  使用printf语句输出时为%d
  printf("%f\n",3.14); //浮点型 使用printf语句输出时为%f
  return 0;
}

// 其中\n是指在输出时换行

四、运算符

程序中数字之间是可以像数学中数字一样进行运算的。
如下:

#include <stdio.h>

int main() {
  printf("%d\n",1+2+3);
  return 0;
}

常用的简单运算有算术运算符、关系运算符和逻辑运算符三类运算符。

类型常用符号注意
算术运算符+ 、 - 、 * 、 / 、 %%指的是取余操作
移位运算符左移为<< ; 右移为>>汇编语言中常用,知识将一个值的位向左移或向右移。
位操作符与:& 或:| 异或 ^
赋值=赋值同时还是一个表达式,赋值表达式的值就是左操作数的新值
复合赋值符+= -= *+ /= %= <<= >>= &= ^= |=+=为例,a+=b 其实就是 a=a+b,这种写法主要是使得代码更加紧凑。
单目操作符++、 – 、 &(取地址)、 sizeof(判断操作数的类型长度)这里需要特别注意的是++-- ,在a++ 这个表达式中隐含两个值,一个是变量a本身的值,一个是表达式a++的值,在后缀和前缀这两种表达中,变量的值都会发生改变,但只有当其为前缀时表达式的值为变量改变后的值。
关系操作符> >= < <= != ==需注意这些操作符产生的结果都是一个整型值,而不是一个布尔值,所以他可以赋值给一个变量。符合这个关系式的值为1,不符合为0
逻辑操作符&& ||用于对表达式求值,由于这种操作符具有短路操作,所以必须保证表达式的顺序正确。
条件操作符(a>5)?b-6:c/2代替了if-else,意义是指,a>5成立时计算b-6否则计算c/2

五、控制语句

if-else

if(条件){
   /* 如果表达式为真将执行的语句 */
}else{
   /* 如果表达式为假将执行的语句 */
}

也可以直接省略else,有以下代码块;

if(条件){
   /* 如果表达式为真将执行的语句 */
}

或者多分枝选择结构还可以使用如下:

if(条件1){
   /* 当条件1为真时执行 */
} else if(条件2){
   /* 当条件2为真时执行 */
} else if(条件3){
   /* 当条件3为真时执行 */
}else{
   /* 当上面条件都不为真时执行 */
}

switch-case

switch(表达式){
    case 整型常量1:
       /* 表达式等于整型常量1执行的代码 */
       break; /* 可选的 */
    case 整型常量2:
       /* 表达式等于整型常量2执行的代码 */
       break; /* 可选的 */
  
    /* 您可以有任意数量的 case 语句 */
    default : /* 可选的 */
       /* 表达式不等于上面所有情况执行的代码 */
}

while循环

while(条件){
   /* 如果条件为真将重复执行的语句 */
}

do-while语句

do {
   /* 如果表达式为真将重复执行的语句 */
}while(条件);

do-while循环与while循环的区别:
do-while循环是先循环后判断,循环体至少执行一次;while循环是先判断后循环,循环体可能一次也不执行。

for 循环

for (初始值;条件;递增或递减){
   /* 如果条件为真将重复执行的语句 */
}

在while和for循环中,break是结束整个循环体;continue是结束单次循环。

练习:打印出一个九九乘法表。


#include <stdio.h>

int main(){

    for(int i=1;i<10;i++)
       {
          for(int j=1;j<=i;j++)
           {
                   printf("%d*%d=%d ",i,j,i*j);
                   if(i*j<10)
                     printf(" ");
            }
          printf("\n");
       }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值