嵌入式学习笔记-Linux-C语言基础-格式化输入输出-混合运算-语言运算符

目录

1.1标准输出函数(printf)

1.2标准输出函数(scanf)

1.3标准输入连续字符或者数字于字符杂糅输入的解决

 1.3.1使用scanf来接收空格

 1.3.2使用getchar()函数进行接收空格或者换行

2.1各类数值型数据间的混合运算

2.2算术运算符和算术表达式

  2.2.1语言运算符


1、标准输入函数(scanf)和标准输出函数(printf)

           注:使用scanf和printf需要引入库文件stdio.h

                    在Linux系统中使用命令man 3 printf或者man 3 scanf命令来查看具体详情

 本文主要讲解的时C语言中的scanf函数和printf函数,了解其他的输入输出可以去c语言 | 菜鸟教程

链接https://www.runoob.com/cprogramming/c-input-output.html

       1.1标准输出函数(printf)

            标准输出函数printf,作用是将参数1输出到屏幕上;参数1中如果有格式化符号,就需要传入对应的值或者变量替换候输出

            标准输出函数原型:int printf(const char* format, ...);

            说明:

                      format:是一个字符串类型,字符串中可以有以%开头的格式化符号,还有非格式化  符(普通字符),还会有转义字符\n

                       ...:可变形式参数,可以有0个或多个;具体数量要和格式化符的数量一致

printf在使用时建议在format的末尾加上换行符\n;

                        \n:换行符可以将输出缓冲区的数据刷新到屏幕上

         1.2标准输出函数(scanf)

                       标准输入函数scanf,作用是将键盘输入的内容存到变量中

                       标准输入函数原型:int scanf(const char* format, ...);

                       说明:

                                format:是字符串类型的,可以写格式化符号,也可以写普通字符,还可以写  转义字符

                                ...:可变形式参数,有多少格式化符就要有多少变量,并且变量前必须加& (取地址符)

                        注意:scanf在使用时,建议format中只写格式化符,并且不要带换行符\n

scanf在输入字符时,建议格式化符中只写

//标准输入函数和标准输出函数

#include<stdio.h>

int main()
{

    //定义变量
    /*
    int a;
    int b;
    int c;
    */
    //一条语句定义三个变量
    int a,b,c;
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);

    //标准出入函数
    scanf("%d%d%d",&a,&b,&c);
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);

    return 0;
}

1.3标准输入连续字符或者数字于字符杂糅输入的解决

        1.3.1使用scanf来接收空格

                若不处理该问题会出现输入的数据不匹配现象

ynl@ynl:~/C_code/inClass/6m4r$ cat demo0.c 
//标准输入函数和标准输出函数

#include<stdio.h>

int main()
{

    //定义变量
    /*
    int a;
    int b;
    int c;
    */
    //一条语句定义三个变量
   /* int a,b,c;
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);
    
    //标准出入函数
    scanf("%d%d%d",&a,&b,&c);
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);
    */
    char a,b,c,tmp;
    scanf("%c%c%c",&a,&b,&c);
    printf("a = %c-----%d\tb = %c-----%d\tc = %c-----%d\n",a,a,b,b,c,c);
    return 0;
}
ynl@ynl:~/C_code/inClass/6m4r$ gcc demo0.c 
ynl@ynl:~/C_code/inClass/6m4r$ ./a.out 
A B C
a = A-----65	b =  -----32	c = B-----66

                定义一个临时变量,来接收空格或换行。

ynl@ynl:~/C_code/inClass/6m4r$ cat demo0.c 
//标准输入函数和标准输出函数

#include<stdio.h>

int main()
{

    //定义变量
    /*
    int a;
    int b;
    int c;
    */
    //一条语句定义三个变量
   /* int a,b,c;
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);
    
    //标准出入函数
    scanf("%d%d%d",&a,&b,&c);
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);
    */
    char a,b,c,tmp;
   // scanf("%c%c%c",&a,&b,&c);
    scanf("%c",&a);
    scanf("%c",&tmp);
    scanf("%c",&b);
    scanf("%c",&tmp);
    scanf("%c",&c);
    scanf("%c",&tmp);
    printf("a = %c-----%d\tb = %c-----%d\tc = %c-----%d\n",a,a,b,b,c,c);
    return 0;
}
ynl@ynl:~/C_code/inClass/6m4r$ gcc demo0.c 
ynl@ynl:~/C_code/inClass/6m4r$ ./a.out 
A B C
a = A-----65	b = B-----66	c = C-----67
ynl@ynl:~/C_code/inClass/6m4r$ 
               1.3.2使用getchar()函数进行接收空格或者换行
ynl@ynl:~/C_code/inClass/6m4r$ cat demo0.c 
//标准输入函数和标准输出函数

#include<stdio.h>

int main()
{

    //定义变量
    /*
    int a;
    int b;
    int c;
    */
    //一条语句定义三个变量
   /* int a,b,c;
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);
    
    //标准出入函数
    scanf("%d%d%d",&a,&b,&c);
    printf("a = %d\tb = %d\tc = %d\n",a,b,c);
    */
    char a,b,c,tmp;
   // scanf("%c%c%c",&a,&b,&c);
    scanf("%c",&a);
    getchar();
    //scanf("%c",&tmp);
    scanf("%c",&b);
    getchar();
    //scanf("%c",&tmp);
    scanf("%c",&c);
    getchar();
    //scanf("%c",&tmp);
    printf("a = %c-----%d\tb = %c-----%d\tc = %c-----%d\n",a,a,b,b,c,c);
    return 0;
}
ynl@ynl:~/C_code/inClass/6m4r$ gcc demo0.c 
ynl@ynl:~/C_code/inClass/6m4r$ ./a.out 
A B C 
a = A-----65	b = B-----66	c = C-----67
ynl@ynl:~/C_code/inClass/6m4r$ 

2.1各类数值型数据间的混合运算

        整型、实型、字符型数据间可以进行混合运算,如:

                10 - 'a' * 1.5

        运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:

将优先级低的类型转换到优先级高的类型

        注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。

        注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。

        说明:

                1、char和short类型参与运算,结果一定是int类型

                                char与char        ----->int

                                short与short      ----->int

                                char与short       ----->int

                2、float类型参与运算,结果一定时double类型

                           flaot类型和所有类型的运算的结果都是double(在旧版C标准是符合该情况)

                3、低优先级与高优先级运算时,会转换成高优先级

                                char与int-->int

                                short与int--->int

                                int与unsigned int-->unsigned int

                                int与double-->double

                                long与long->long

                                long与unsigned long->unsigned long

//数据类型的优先级
#include<stdio.h>

int main()
{

    char a = 10;
    char b = 20;
    printf("char + char 的运算结果的数据类型大小:%lu\n",sizeof(a + b));//4     结果的数据类型是int

    short c = 10;
    short d = 21;
    printf("short + short 的运算结果的数据类型大小:%lu\n",sizeof(c + d));//4     结果的数据类型是int


    printf("char * short 的运算结果的数据类型大小:%lu\n",sizeof(a * c));//4     结果的数据类型是int


    float e = 3.141F;
    printf("short + flaot 的运算结果的数据类型大小:%lu\n",sizeof(c + e))//4     结果的数据类型是float
    
    
    float = 90;  //隐式转换

    return 0;
}

        隐式转换:隐式数据类型转换(从低到高):系统会自动的将低优先级数据类型的数据转换成高优先级数据类型的数据

        强制转换:强制数据类型转换(从高到低):强制,被迫的将高优先级数据类型的数据转换成低优先级数据类型的数据(需要使用特定的代码书写格式)

//强制转换
int a = (int)23.45;         //23   ---强制类型转换有风险,会损失精度,不建议使用
char b = (char)sizeof(int)  //sizeof计算变量或数据类型的所占空间大小,结果类型是unsigned long

//隐式转换
//算术转换:在算术运算中,低级别的类型将自动转换为高级别的类型。
int main() {
    char a = 100;
    int b = 200;
    int result = a + b; // char类型自动转换为int类型
    printf("%d\n", result);
    return 0;
}

//赋值转换:在赋值操作中,右侧表达式的类型将转换为左侧变量的类型。
int main() {
    char a = 'A'; // 字符常量转换为char类型
    int b = a; // char类型转换为int类型
    printf("%d\n", b);
    return 0;
}

//函数调用:传递参数给函数时,实参的类型可能会转换为形参的类型
void printValue(int a) {
    printf("%d\n", a);
}

int main() {
    char c = 'C';
    printValue(c); // char类型转换为int类型
    return 0;
}

//无符号类型转换:当涉及无符号类型时,某些情况下整数会提升为无符号类型。
int main() {
    unsigned int a = 10;
    int b = -20;
    if (a > b) { // int类型转换为unsigned int类型
        printf("a is greater\n");
    } else {
        printf("b is greater\n");
    }
    return 0;
}

//浮点类型提升:在浮点数运算中,float类型的操作数会自动转换为double类型
int main() {
    float a = 1.0f;
    double b = 2.0;
    double result = a + b; // float类型自动转换为double类型
    printf("%f\n", result);
    return 0;
}

2.2算术运算符和算术表达式

        运算符:一些被C语言赋予特定功能的符号  例如:+   *   =   sizeof

        表达式: 将(变量或常量)数据用运算符连接起来形成的式子 23 > 45   int a = 90;

        一般以分号(;)结尾,C语言支持单独写一个常量语句或者变量语句

    2.2.1语言运算符

        1、C运算符

                (1)算术运算符    +   -   *   /   % ;  (2)关系运算符      V  =  ==  !=;

                (3)逻辑运算符    !&&  ||;            (4)位运算符        <<  >>  ~  ^  &;

                (5)赋值运算符    =  +=  -=  *=  /=  %=;

                (6)条件运算符(三目运算符)     ?: ;

                (7)逗号运算符     ,  ;                        (8)指针运算符     *  &  ;

                (9)求字节数运算符     sizeof  ;         (10)下标运算符     [ ]  ;

                (11)强制类型转换运算符     (类型);  (12)分量运算符     .  ->  ;

                (13)其它     如函数调用运算符();

                1.算数运算符: +  -   *   /   %    ++    --

                    +  -  * 和数学中的操作一样; 先算乘除后算加减

                /(取商
                :两个整数相除,结果是取商    例如:5/2 ==>2
                : 浮点数相除,和数学中的一样,得到的是浮点数    

                        5/2.0 ==>2.5   5.0/2==>2.5   5.0/2.0==>2.5

                %(取余/取模)
                :两个整数相除,结果取余数        例如:5/2==>1
                : 浮点数不能取余操作    例如:5.0 % 2  语法错误

                

                ++(自增/递增)
                - -(自减/递减

                :++,--是单目运算符(一元运算符),操作的数据只能是一个变量,不能是常量;

                例如++a, a++;  错误-->5++, ++5


                : ++或--在单独使用时,放在变量左侧或放在变量的右侧效果一样,都是给变量的值加1(减1)后再赋值给变量
                    例如:
                        nt a = 2;
                        a++;  //单独使用   与a = a + 1;的结果一样
                        ++a;  //单独使用   与a = a + 1;的结果一样
                        作为for循环语句的结构中
                        for(;; ++a);  //单独使用
                        for(;; a++);  //单独使用

                        printf("%d\n", a++); --- 不是单独使用

                    如果不是单独使用:
                    自增/自减在变量之前:先自增或自减,再参与其他运算
                    自增/自减在变量之后:先参数其他运算,后自增或自减

                    :浮点数也可以自增或自减,但只会操作整数部分  --- 很少对浮点数做自增或自减操作
                    例如:float a = 11.2;
                               a++;  a==>12.2

                单目运算符/一元运算符:该运算符只能运算一个数,这样的符号称为一元运算符
                双目运算符/二元运算符:该运算符的左侧和右侧分别有数据,连接的是两个数据,所以称为二元运算符
                三目运算符/三元运算符:表达式1?表达式2:表达式3; 只有一个三元运算符,该运算符连接的是三个数据

                结论:
                    运算符的优先级:(从高到低)
                                             一元运算符  >  二元运算符  >  三元运算符

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值