• 【C语言拓展】运算符、scanf与scanf_s的区别、特点



    前言

    本节课讲的是拓展提升:运算符,为什么vs高版本不能使用scanf,scanf_s与scanf的区别与优缺点
    strcpy与strcpy_s的区别与优缺点


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、运算符

    运算符

    运算符优先级与结合性的本意是先后结合哪个子表达式,相当于先分组,分组完 毕后,从左向右依次计算

    int a = 1, b = 4, c = 8, d = 12, e = 99, f; 
    f = a + b - c * d / e;
    
    • 1
    • 2

    结合过程如下:
    1、乘除优先级高,先结合,乘除同级从左到右结合即按优先级先结合乘法/除法,乘除结合性从左到右,所以先结合 c*d,然后/e
    2、再结合加减,同级从左到右结合,即先结合 a+b,然后结合减法
    3、最后结合赋值运算符

    此表达式先算 a+b,而不是 c*d,所以优先级与结合性不是单纯的谁先算谁后算。我 们正常脑算看待优先级可以以先算后算来处理,不会影响结果

    for循环最通用的写法

    在for循环前写循环控制变量

    //最通用的写法: 
    int i ; //即循环控制变量的定义位置
    for (i = 0; i < 5; i++) 
    //在 vs2013 以上版本可以如下写:
    for (int i = 0; i < 5; i++) 
     //但是该写法很多编译器都不支持,所以建议使用上边那种,以增加代码移植性
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    真短路或"||"

    逻辑运算符:|| 读 或
    运算规则:
    真 || 真 为真 结果 1 真 || 假 为真 结果 1 假 || 真 为真 结果 1 假 || 假 为假 结果 0

    真短路 || : 因为“真 || 表达式”结果一定是真,即“表达式”不管是什么都不改变结果,
    所以“表达式”就不执行了,执行也是浪费时间,举例如下:

    int a = 1, b = 1;
    5 || (a=66) || (b=87);
    
    • 1
    • 2

    过程:(依据优先级结合性执行即可)
    5 为真,子表达式 5 || (a=2)中发生短路,所以(a=2)不执行,子表达式 5 || (a=2)结果 为真,即 1。 剩下 1 || (b=2),1 为真,短路||,所以(b=2)不执行,表达式 1 || (b=2)结果为真。 最终整个表达式结果为真,即 1,a、b 值保持 1 不变。

    0 || (a=2) || (b=2);
    
    • 1

    过程:(依据优先级结合性执行即可)
    短路原理的目的:增加程序执行效率

    假短路与"&&"

    逻辑运算符:&& 读 与
    运算规则:
    真 && 真 为真 结果 1 真 && 假 为假 结果 0 假 && 真 为假 结果 0 假 && 假 为假 结果 0

    假短路&&:因为“假 && 表达式”结果一定是假,即“表达式”不管是什么都不改变结果

    int a = 2, b = 2;
    0 && (a=0) && (b=0);
    
    • 1
    • 2

    过程:(依据优先级结合性执行即可)
    0 为假,子表达式 0 && (a=0)发生短路,不执行(a=0),子表达式 0 && (a=0)为假, 即 0。剩下 0 && (b=0),0 为假,子表达式 0 && (b=0)发生短路,不执行(b=0),子表达 式 0 && (b=0)为假,即 0。 最终整个表达式结果为假,即 0,a、b 保持 2 不变

    &&和||混合短路

    与(&&)、或( || )混合短路:
    执行原则:按照优先级与结合性分组,然后从左到右计算,遇到短路就短路,&&优
    先级高于 ||

    短路原理与代码优化

    短路原理对代码优化的警示 真短路或: (条件 1) || (条件 2) 为真概率大的条件放左边,可以减少两个条件同时执行的概率,从而增加程序执行效率。
    两个条件都判断执行的概率是 80% 假短路与:
    (条件 1) & & (条件 2)
    为假概率大的条件放左边,可以减少两个条件同时执行的概率,从而增加程序执行效率。

    二、scanf与scanf_s

    scanf_s是什么:scanf_s 与 scanf _s 版本的函数是 C11 标准的新函数,非_s 就是旧版 C 语言函数,新编译器建议大家使用新 版本的_s 函数

    如何在vs高版本使用scanf

    scanf 在高版本 vs 报错问题解决办法
    1、声明宏 : #define _CRT_SECURE_NO_WARNINGS
    2、关掉 sdl : 属性->c/c+±>常规->sdl 检查
    3、scanf_s

    scanf_s比scanf安全?

    scanf_s 比 scanf 安全? 主要体现在越界问题中的处理措施 scanf 是在程序结束后报异常中断,不会立即中断
    缺点 1,假设数万行代码,有数百个 scanf 输入,这时很难短时间内定位到越界点。
    缺点 2,越界操作可能会侵害其他变量的空间,导致未知的莫名其妙的错误。
    缺点3,程序不结束,其问题可能会像蝴蝶效应,影响越来越离谱。
    scanf_s 会执行失败,变量输入不成功,函数返回值为 0
    优点 1,可能及时知道错误点,并及时做出相应处理
    优点 2,不会导致越界问题,所以不会侵害其他变量空间

    三、strcpy与strcpy_s

    参数的区别:

    //参数使用区别 
    strcpy_s(str, 20, "hello "); //参数 2 表示参数 1 的字节数 
    strcpy(str, "hello w");
    
    • 1
    • 2
    • 3

    为啥要使用strcpy_s?

    strcpy_s 比 strcpy 安全? 主要体现在越界问题中的处理措施 strcpy 是在程序结束后报异常中断,不会立即中断,跟 scanf 越界情况 1 样
    缺点 1,假设数万行代码,有数百个 strcpy 使用,这时很难短时间内定位到越界点。
    缺点 2,越界操作可能会侵害其他变量的空间,导致未知的莫名其妙的错误。
    缺点3,程序不结束,其问题可能会像蝴蝶效应,影响越来越离谱。
    strcpy_s 会立即中断,即函数调用位置中断,跟 scanf_s 处理方式不同
    优点 1,立即知道错误点,并及时做出相应处理
    优点 2,不会导致越界问题,因为直接停下了,不会往下运行了,所以不会侵害其他变
    量空间

  • 相关阅读:
    Python基础知识整理 01-变量、数据类型、运算符、判断语句、循环语句
    14.PyQt5应用程序主窗口QmainWindow详解
    apk获取MD5方式记录
    台式机卡死救机心情点滴记录
    Git使用说明,持续更新
    Spacedrive:开源跨平台文件管理 | 开源日报 No.57
    Python 数据操作教程之如何在 Python 中转置矩阵
    Golang 协程池 Ants 实现原理,附详细的图文说明和代码
    酷快讯:Eminem和Snoop Dogg无聊猿新MV加持后ApeCoin上涨22%
    语音分离---学习笔记(1)
  • 原文地址:https://blog.csdn.net/m0_62599305/article/details/126590410