欢迎光临散文网 会员登陆 & 注册

C语言运算符、表达式、声明

2022-12-25 05:26 作者:虚云幻仙  | 我要投稿

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define M_PER_H 60 //声明常量,每小时60分钟


int conversion(int n); // 声明函数原型,该函数需要一个int类型参数(形式参数parameter),返回int类型的值

void time_calculate(void);

void show_number(void);

int main(void)

{

int a1, a2, a3;

a1 = a2 = a3 = 5; // 三重赋值从右往左依次将5赋值给a3,将表达式a3=5赋值给a2,表达式a3=5的值等于左值a3的值,即(a3=5)的值是5,a2 = a3 = 5和a2 = (a3=5)等价,而表达式a2=5的值为a2的值即5,赋值给a1,所以从右往左依次将a3、a2、a1的值赋值为5

a1 = 9 / a2; //整数除法会发生截断,结果为1,运算的整个过程中并不会出现小数,所以不存在四舍五入,结果永远是数学计算的结果截断小数的部分即商

a2 = -9 / a3; //存在负整数的整数除法同样截断小数,-1.8截断变成-1,c99标准称为趋零截断,1.8截断变成1,正数负数都向零截断

printf("%f\n", 9.0/a3); // 两种类型以上的混合计算时,程序会先进行类型转换,转换成同类型之后再运算,所以9.0/5变成9.0/5.0,结果为1.800000

printf("%zd\n", sizeof a1); //sizeof为运算符而非函数

size_t a4 = 1; // size_t并非一种有别于int/long/unsigned等的新的数据类型,而是头文件通过typedef声明的某种类型的别名,在有些系统中将size_t设定为unsigned long int 的别名

typedef int in; // typedef 类型 别名  ,设定in为int的别名

in a5 = 1; // 定义in类型变量a5,因为设定in为int的别名,所以等价为int a5 = 1;

printf("%zd\n", sizeof a5); // a5同样占4字节,因为实际类型是int

a1 = 5;

a2 = 3; //赋值表达式语句,=为赋值运算符,将右侧的值(右值)赋给左侧的变量(左值)

a3 = a1 % a2; //求模运算符%,即取a1除以a2的余数

a3 = a1 - (a1 / a2) * a2; //这个表达式和求模等价,因为整数除法取商,所以a1/a2结果为1,用a1减去 商*a2 得到的就是余数

printf("%d\n", -9 % 5); // 用上面的表达式能够解释这一行的结果-4,由于趋零截断,-9/5结果为-1,所以-9-(-1*5)结果为-4,而9%-5的结果是4,余数永远和被除数(-9)同符号,整数除法的趋零是结果截断小数,求模的趋零是余数保持与被除数同符号取趋于零的最近数

while (a2++<5) // while循环,()括号内条件成立则执行{}块内的内容,循环判定()为true执行{}的过程直到()为false向下执行}后的内容,a2++是指先使用a2再递增+1

{ //执行到这里时a2已经递增了

    printf("%d", a2); //结果为45

} // 即使最后一次判定时a2<5为false,在该语句while (a2++<5)括号结束之前C语言要求完成内部所有运算包括递增赋值,所以即使a2<5为false,由于a2已经使用过了,这时也会递增1变为6

printf("\n%d\n", a2); //结果为6

a1 = 1;

a2 = 5 + a1++; //a1++指先使用a1再递增,所以表达式中的a1代入1,a2为5+1即6,a1递增变为2

a1--; // 递减,a1的值变回1

a2 = (5 + a1++) * 2; //a1++指先使用a1再递增,所以即便括起来,在表达式中的a1值也是1

printf("%d\t%d\n", a2, a1); //结果a2为(5+1)*2即12,a1为2

a1 = 1;

while (++a1<2)

{

    printf("++a1表示先递增再使用,所以a1先变为2,再判断<2false,所以这一条打印语句不会执行");

}

a1 = 1;

a2 = 5 + (a1 = a1 + 2); //赋值表达式也有值,a1=a1+2使得a1变为3,但表达式(a1=a1+2)本身的值也是3,赋值表达式的值等于赋给左值/变量的值

printf("%d\n", a2);

a1 = 3;

while (++a1 <= 4)

    printf("%d\n", a1); //当while语句的{}块内只有一个语句时可以省略{},写成带缩进的形式便于阅读,C语言不要求缩进

char c1 = 5; //5为int常量,赋值给char时发生截断,只取最后一个字节的值,因为值没有超过255所以结果仍然是正确的

printf("%f\n", c1 * 2 / 3.0); //表达式c1*2/3.0中出现三种类型,c1为char,2为int,3.0为double,执行时根据优先级及结合律逐渐转换类型,char和short类型在表达式和函数传参时会自动转换为int,int的5和int的2相乘结果为int的10,再和3.0运算,运算之前转换为double的10.0/3.0

printf("%f\n", 2 / 3 * 4.0); //结果为0,因为先运算整数除法2/3趋零截断结果为0,再和double的4.0运算,所以结果为0

c1 = 1;

printf("%f\n", (float)c1 / 3 * 4); //在变量/常量之前使用(类型)强制转型,1先强转为1.0f再运算,后面的int自动转为同类型float,结果作为double打印出来

//char/short出现在表达式或作为函数的参数时会自动转换为int,float在函数参数中会自动转换为double

double d1 = 1.0;

printf("%d\t", conversion(d1)); //函数conversion()的定义在下方,将double类型的d1传给函数,由于函数需要int类型的参数,所以会发生类型强制转换,传的实参(实际参数argument)d1为1.0,经过类型强制转换后函数内的形参n为1

// 结果为20,这里返回的是形参n的值

printf("%f\n", d1); //由于实参传的并不是变量d1而是变量d1的值,所以无论函数内发生什么变化,都不会对d1产生影响,d1仍然是1.0,函数接收实参1.0初始化形参n,实参是d1的值而不是d1

show_number();

return 0;

}

int conversion(int n) { //到这里时形参n的值仍然为实参传进来的int值

n = 20; // 这里改变了形参n的值,虽然用于初始化的实参/值没有使用,但也不会改变主调函数变量d1本身

return n; //返回了形参n的值,形参的作用域到}括回结束

}

void time_calculate(void) {

int min = 0;

printf("分钟转换小时的程序\n请输入分钟(小于等于0退出程序):");

scanf("%d", &min);

while (min > 0) // 直到用户输入0或负数跳出循环

{

printf("%dmins = %dhours %dmins\n", min, min / M_PER_H, min % M_PER_H);

printf("请输入分钟(小于等于0退出程序):");

scanf("%d", &min); // 通过用户输入来迭代

}

printf("运行结束");

const int D_PER_W = 7; // 使用const设定只读变量,在初始化值之后不能进行修改,只读变量必须在声明的语句内进行初始化,初始化不是赋值,不能分成两个语句

}

void show_number(void) {

int num;

int count = 0;

printf("打印一个整数到其加10(包含)内的所有整数\n输入一个整数:");

scanf("%d", &num);

while (++count <= 11) //通过++递增来迭代,打印包头包尾所以总共11个数,count从1到11都判定true执行11次循环

    printf("%3d ", num++); // num++先打印本身再递增

printf("\n");

}

double temperatures() {

double n = 1.0;

const double SHE = 5.0 / 9.0;

printf("enter hua:");

while (scanf("%lf", &n) == 1) // 利用scanf()函数返回值(读取数据的数量)作为循环条件,scanf使用%lf需要读取一个double数字,如果读取到数字则返回值为1,如果读到第一个非空白字符为非数字字符,则不赋值并将该字符放回,并且停止执行当前scanf的后续读取(如果有的话),这时由于没有赋值/读取到数字,赋值/读取到的数据数量为0,条件为false退出循环

{

printf("hua:%.2f\tshe:%.2f\tkai:%.2f\n", n, SHE * (n - 32.0), SHE * (n - 32.0) + 273.16);

printf("enter hua:");

}

char str[20];

scanf("%s", str); //由于while循环的最后一次scanf()将非数字字符放回了输入,所以现在输入中还留有非空白字符,如果后续程序还需要读取输入,在往后进行之前应该将输入清空

printf("%s", str);

scanf("%*s"); //scanf使用%*s实现只读取不赋值,只是为了清理输入队列

}


C语言运算符、表达式、声明的评论 (共 条)

分享到微博请遵守国家法律