C-study(五).2

逻辑运算符

连接两个完整的关系表达式。
&& 逻辑与,ab都为真时,a&&b的值真,其余时候假。
|| 逻辑或,ab都为假时,a||b的值假,其余时候真。
! 逻辑非、只需要一个运算对象,a真,!a假,a真,!a假。

逻辑表达式求值顺序:从左往右

&&和II 都是序列点,到&&或||之前副作用都会生效

一旦发现有使整个表达式为假的因素,会立即停止求值
第一个条件不成立时 && 之后的语句都直接跳过

#include <ctype.h>   //为isspace ()函数提供原型
#include <stdbool.h> //为bool、 true、 false提供定义
#define PERIOD '.'
#define STOP '|'         // 标记输入结束
    /*
    if(range>=90 &&range<=100) //不可以用90<=range<=100

    (ch != '"' | | ch != '\'') // 使用 || 两个条件有一个为真时为真,都为假时为假

    if (!(ch != '"')) // 使用 ! 条件为假时为真,为真时为假
    6 > 2 && 3 == 3 为真。 !(6 > 2 && 3 == 3) 为假。

    a>b&&b>c||b>d 相当于 ((a>b)&&(b>c))||(b>d)

    if(num!=0&&12/num==2)//&& 第一个表达式为假(num==0)时,会直接跳过后面的表达式,所以不会出现 除以0的情况
    x != 0 && 20 / x < 5只有在x是非零时才会对第2个表达式求值。

    while(x++<10&&x+y<20) //&&是序列点,可以保证在x+y的时候已经完成了自增操作*/

    char ch;
    int charcount = 0;
    while ((ch = getchar()) != PERIOD) // 读字符并检查是不是.
    {
        if (ch != '"' && ch != '\'') // &&:两个条件都为真时为真,不是"和'时记数
            charcount++;
    }
    printf("There are %d non-quote characters.\n", charcount);

    char c;              // 读入字符
    char prev;           // 读入的前一个字符
    long n_chars = 0L;   // 字符数
    int n_lines = 0;     // 行数
    int n_words = 0;     // 单词数
    int p_lines = 0;     // 不完整的行数
    bool inword = false; // 如果c在单词中,inword 等于true

    printf("Enter text to be analyzed (| to terminate) : \n");
    prev = '\n';                    // 用于识别完整的行
    while ((c = getchar()) != STOP) // getchar便于统计字符 读到|结束循环
    {
        n_chars++; // 统计字符

        if (c == '\n')
            n_lines++; // 统计行

        if (!isspace(c) && !inword) // 不是空格,不在单词内,则在单词开头标记inword,相当于inword==false
        {
            inword = true; // 开始一个新的单词
            n_words++;     // 统计单词
        }

        if (isspace(c) && inword) // 是空格,在单词内,说明一个单词结束,标记inword为false不在单词内
            inword = false;       // 打到单词的末尾

        prev = c; // 保存字符的值
    }
    if (prev != '\n')
        p_lines = 1; // 不完整的一行
    printf("characters = %ld,words = %d,lines = %d,", n_chars, n_words, n_lines);
    printf("partial lines = %d\n", p_lines);

条件运算符 ?:

唯一的三元运算符,每个运算对象都是一个表达式
expression1 ? expression2 :expression3

expression1为真(非0),表达式的值为expression2,否则为expression3

if else语句的便捷方式

#define COVERAGE 350        // 每罐油漆可刷的面积(单位:平方英尺)
//max=(a>b)?a:b; 取最大值
//(5>3)?1:2的值为 1。
//(3>5)?1:2的值为 2。
    int sq_feet;
    int cans;

    printf("Enter number of square feet to be painted : \n");
    while (scanf("%d", &sq_feet) == 1)
    {
        cans = sq_feet / COVERAGE;                   // int除法会被截断
        cans += ((sq_feet % COVERAGE == 0)) ? 0 : 1; // 取余等于0说明刚刚好,不等于0说明多一桶

        printf("You need %d %s of paint . \n", cans, cans == 1 ? "can" : "cans"); // 如果值是1则打印can,否则打印cans
        printf("Enter next value (q to quit) : \n");
    }

按位运算符

~ :按位取反,一元运算符。
& :按位与运算符
| :按位或运算符
^ :按位异或运算符
<<:左移运算符,num<<n,num左移n位(*2n)。左边丢掉右边补0。
>> :右移运算符,num>>n,num右移n位(/2n)。右边丢掉左边补0。
在这里插入图片描述

示例
假设有下面的代码:
int x= 2;//010
int y= 3;//011
x&y = 2 // 010
y<<x = 12// 1100

其他运算符

sizeof运算符和size_t类型

sizeof:返回运算对象的字节大小,一元运算符
返回size_t类型的值,是语言定义的标准类型
%zd 或者%u %lu

// 使用C99新增的%zd转换说明--如果编译器不支持%zd, 请将其改成%u或%lu
int n = 0;
size_t intsize;// sizeof返回值,是无符号整型(的typedef别名),相当于 typedef unsigned int size_t
intsize = sizeof(int);//运算对象可以是类型或具体数据对象,是类型时必须加()
printf("n = %d,n has %zd bytes; all ints have %zd bytes. \n",
       n, sizeof n, intsize);//是具体对象()可以省略

() 强制类型转换运算符

(目标类型)

mice = 1.6+1.7;//3.3->3 先计算,在转换
mice = (int)1.6+(int)1.7;//先转换1+1

强制转换超出范围时依然会出错
显示选择合适的类型,强制类型转换指明转换类型,避免出现不正确的自动转换

逗号运算符 ,

性质:
保证从左往右求值,
是一个序列点,逗号左侧的副作用会在执行逗号右侧之前发生

逗号表达式的值是右侧项的值

const int FIRST_OZ = 46; // 2013邮资
const int NEXT_OZ = 20;  // 2013邮资
int ounces, cost;
printf(" ounces   cost\n");
/*
* 初始化表达式的逗号是两个值都可进行初始化
* 更新表达式的初始化可使两个值每次迭代都变化
* 
* x=(y=3,(z= ++y +2)+5)先给y赋3,y++为4,4+2为6赋给z,6+5赋给x
* i=5,500;相当于i=5;500;
* i=(5,500);相当于i=500;
*/
for (ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
    printf("%5d $%4.2f\n", ounces, cost / 100.0);

类型转换

在语句和表达式中应使用类型相同的变量和常量

基本转换规则

1、升级
unsigned和signed的char和short会被自动转换为int
如果short和int的大小相同,unsigned short 比int大时会自动转换为unsigned int
float会自动转换为double

2、涉及两种类型的运算,两个值会被分别转为两个类型的更高级别

3、级别从高到低:
long double
double
float
unsigned long long
long long
unsigned long
long
unsigned int(当long=int,unsigned int >long)
int
当long和int大小相同时,unsigned int比long级别高

4、赋值时计算的最终结果会被转换成被赋值变量的类型,包括升级和降级

5、函数参数传递,char和short被转换为int,float被转换为double,函数原型会覆盖升级

降级可能会导致放不下整个数字
整型转换为无符号整型,额外的位被忽略,eg:目标类型是8位无符号整型,原始值求256模

char ch;
int i;
float fl;
fl = i = ch = 'C';
/*
1字节的ASCII存储在ch中
转换为ASCII中C对应的整数67,四字节存储在i中
67转换为浮点数存储在fl中
*/
printf("ch=%c,i=%d,fl=%2.2f\n", ch, i, fl);
ch = ch + 1;       /*转换成整数67+1,结果是4字节整数68然后截断1字节存在ch*/
i = fl + 2 * ch;   /*ch转换为4字节整数68,乘以2,转换为浮点数和fl相加,转换为int存储在i*/
fl = 2.0 * ch + i; /*ch转换为浮点数,乘以2,把i转换为浮点数,相加存在fl*/
printf("ch=%c,i=%d,fl=%2.2f\n", ch, i, fl);
ch = 1107; /*超出范围取256模*/
printf("Now ch = %c\n", ch);
ch = 80.89; /*截断*/
printf("Now ch = %c\n", ch);

带参函数

void pound(int n); // ANSI函数原型声明,表明该函数接受一个 int 类型的参数 ,且没有返回值

const int S_PER_M = 60;         // 1分钟的秒数
const int S_PER_H = 3600;       // 1小时的秒数
const double M_PER_K = 0.62137; // 1公里的英里数
	int times = 5;
    char ch = '!'; // ASCII码是33
    float f = 6.0f;
    pound(times); // int 类型的参数,把实参5传递给函数,把5赋值给形参,即把times的值拷贝给函数中的新变量n
    pound(ch);    // 和pound((int)ch);相同,根据函数声明自动转换
    pound(f);     // 和pound((int)f);相同,如果函数声明没提供参数类型,则不会转换,只会自动升级为double,使用时错误

    double distk, distm; // 跑过的距离(分别以公里和英里为单位 )
    double rate;         // 平均速度(以英里/小时为单位)
    int min, sec;        // 跑步用时(以分钟和秒为单位 )
    int time;            // 跑步用时(以秒为单位)
    double mtime;        // 跑1英里需要的时间,以秒为单位
    int mmin,msec;       // 跑1英里需要的时间,以分钟和秒为单位
    printf("This program converts your time for a metric race\n");
    printf("to a time for running a mile and to your average\n");
    printf("speed in miles per hour.\n");
    printf("Please enter, in kilometers, the distance run, \n");
    scanf("%lf", &distk); // %lf 表示读取一个 double 类型的值
    printf("Next enter the time in minutes and seconds,\n");
    printf("Begin by entering the minutes.\n");
    scanf("%d", &min);
    printf("Now enter the seconds,\n");
    scanf("%d", &sec);
    time = S_PER_M * min + sec;    // 把时间转换成秒
    distm = M_PER_K * distk;       // 把公里转换成英里
    rate = distm / time * S_PER_H; // 英里/秒X秒/小时=英里/小时
    mtime = (double)time / distm;  // 时间/距离 =跑1英里所用的时间
    mmin = (int)mtime / S_PER_M;   // 求出分钟数
    msec = (int)mtime % S_PER_M;   // 求出剩余的秒数
    printf("You ran %1.2f km (%1.2f miles) in %d min,%d sec.\n", distk, distm, min, sec);
    printf("That pace corresponds to running a mile in %d min,", mmin);
    printf("%d sec.\nYour average speed was %1.2f mph,\n", msec, rate);

void pound(int n)
/*ANSI 风格函数头
返回值类型 函数名(返回值类型 形参名) ,不需要参数或返回值时用void,
括号内就包括形参变量的声明,形参的变量名是函数私有的,不会和其他处相同名称发生冲突
实际函数调用传递的值为实参*/
{ 
    while (n-- > 0)
        printf("#");
    printf("\n");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777118.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

维护和管理LDAP之OpenDJ

目录 基本介绍 服务专有名词 安装 命令行工具 密码管理 重置管理员密码 管理服务器进程 管理索引 如何搜索 管理索引 管理目录数据 测试数据 导出数据 导入数据 LDIF文件数据查看和比较 数据存储-Backends 配置连接 开启 HTTP/HTTPS连接 使用 REST访问 -open…

三、虚拟机连接外网

来源网站&#xff1a;山海同行 来源地址&#xff1a;https://shanhaigo.cn 本篇资源&#xff1a;以整理分类并关联本篇地址 本篇地址&#xff1a;https://shanhaigo.cn/courseDetail/1805875642621952000 一、配置虚拟机 1. 选择NAT模式 编辑虚拟网络设置&#xff0c;选择NAT…

1分钟完美音质克隆:配音软件全面超越,

随着人工智能技术的不断进步&#xff0c;配音软件在提供高质量声音输出方面取得了显著成就。本文所讨论的软件产品&#xff0c;凭借其卓越的性能&#xff0c;已成为自媒体创作者在声音制作方面的首选工具。 2. 软件产品概述 该软件利用先进的算法和机器学习模型&#xff0c;为…

docker也能提权??内网学习第6天 rsync未授权访问覆盖 sudo(cve-2021-3156)漏洞提权 polkit漏洞利用

现在我们来说说liunx提权的操作&#xff1a;前面我们说了环境变量&#xff0c;定时任务来进行提权的操作 rsync未授权访问覆盖 我们先来说说什么是rsync rsync是数据备份工具&#xff0c;默认是开启的873端口 我们在进行远程连接的时候&#xff0c;如果它没有让我们输入账号…

IT入门知识第八部分《人工智能》(9/10)

1.引言 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;已成为推动技术革新的关键力量。它们不仅改变了我们与机器的互动方式&#xff0c;还极大地拓展了解决问题的可能性。本文将深入探讨人工智能和机器学习的基础&…

哨兵1SAR空间数据包协议数据单元文档(七)

《哨兵1SAR空间数据包协议数据单元》文档对数据包的结构进行了详细描述&#xff0c;并提供了用户数据的格式和解码算法。 原文链接: 哨兵1SAR空间数据包协议数据单元文档英文版 同系列中的其他文章篇链接: 哨兵1SAR空间数据包协议数据单元文档&#xff08;一&#xff09; 哨兵…

Day05-03-Nexus仓库

Day05-03-Nexus仓库 05-nexus-仓库1. 概述2. 极速部署指南2.1 下载2.2 部署2.3 配置2.4 连接使用nexus2.4 编译与测试 3. 总结 05-nexus-仓库 1. 概述 背景: maven编译的时候&#xff0c;npm/cnpm编译&#xff0c;需要下载大量的依赖包。这些依赖包在每一次构建的时候都需要使…

横截面交易策略:概念与示例

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

大模型成为软件和数据工程师

前言 想象一下这样一个世界&#xff1a;人工智能伙伴负责编码工作&#xff0c;让软件和数据工程师释放他们的创造天赋来应对未来的技术挑战&#xff01; 想象一下&#xff1a;你是一名软件工程师&#xff0c;埋头于堆积如山的代码中&#xff0c;淹没在无数的错误中&#xff0…

Rust作用域和遮蔽

作用域和遮蔽 变量绑定有一个作用域&#xff08;scope&#xff09;&#xff0c;它被限定只在一个代码块&#xff08;block&#xff09;中生存&#xff08;live&#xff09;。 代码块是一个被 {} 包围的语句集合。另外也允许[变量遮蔽][variable-shadow]&#xff08;variable s…

【代码随想录——图论——岛屿问题】

1.岛屿数量 https://kamacoder.com/problempage.php?pid1171 1.1 深度优先搜索 package mainimport "fmt"var direction [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}func main() {var M, N intfmt.Scanln(&N, &M)sea : make([][]int, N)visited : make…

SSRS中生成二维码

1.二维码搭建, fastapi,qrcode,python-barcode from fastapi import FastAPI, HTTPException from pydantic import BaseModel import qrcode from io import BytesIO from fastapi.responses import StreamingResponse import barcode from barcode.writer import ImageWrite…

关于Unity粒子(2D序列帧粒子)的旋转、StartRotation值用脚本怎么动态设置

今天要用粒子做一个拖尾效果。由于对象的移动可以向任何方向&#xff0c;所以作为拖尾的粒子要根据方向做相应的旋转。 1.没有旋转的情况&#xff08;物体向下移动&#xff09;时&#xff0c;默认是下面这样的。 粒子发射器的形状是一个向上的长方形&#xff0c;粒子的移动方向…

在Linux系统中配置GitHub的SSH公钥

在Linux系统中配置GitHub的SSH公钥&#xff0c;可以让您无需频繁输入密码即可与GitHub仓库进行交互&#xff0c;提高工作效率。以下是配置步骤: 第一步&#xff1a; 检查SSH密钥是否存在 首先&#xff0c;检查您的用户目录下的.ssh文件夹中是否已有SSH密钥。打开终端&#xff0…

Interview preparation--Https 工作流程

HTTP 传输的弊端 如上图&#xff0c;Http进行数据传输的时候是明文传输&#xff0c;导致任何人都有可能截获信息&#xff0c;篡改信息如果此时黑客冒充服务器&#xff0c;或者黑客窃取信息&#xff0c;则其可以返回任意信息给客户端&#xff0c;而且不被客户端察觉&#xff0c;…

Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

Java经典面试题将一个字符串数组进行分组输出&#xff0c;每组中的字符串都由相同的字符组成 题目&#xff1a; 将一个字符串数组进行分组输出&#xff0c;每组中的字符串都由相同的字符组成 举个例子&#xff1a;输入[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”] 输出…

考CFA ESG踩过的坑,想考CFA ESG的同学,可以收藏

考CFA ESG踩过的坑 考证也是蹭热点&#xff0c; 2020年&#xff0c;那时是云&#xff0c;阿里云&#xff0c;腾讯云&#xff0c;华为云竞相绽放&#xff0c; 再过点时间&#xff0c;好像安全方面的证书&#xff0c;如油炸爆米花一样&#xff0c;噼里啪啦地蹦了出来&#xff0…

基于STM32与ESP8266的智能电表设计与实现:实时监测,远程管理(附代码实例)

一、项目背景 随着物联网技术的快速发展&#xff0c;传统电表已经无法满足智能电网对用电信息采集、分析和管理的需求。智能电表作为新一代电能计量设备&#xff0c;具有实时监测、远程抄表、用电分析等功能&#xff0c;是实现智能电网的重要基础设施。 本项目旨在设计并实现…

猫狗图像分类-划分数据集

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

【Linux】:程序地址空间

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux程序地址空间的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从…