【C语言】07-基本语句和运算
一、基本语句
C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下
- 循环语句(do while、while、for)
- 条件语句(if 、if-else、switch)
- goto语句
二、基本运算
计算机的基本能力就是计算,所以一门语言的计算能力十分重要。C语言之所以无所不能,很大原因在于它有强大的计算能力。C语言一共有34种运算符,其中的大多数运算符跟在Java中的用法是一样的。下面做一个简单介绍。
1.算术运算符
- + 加法运算符
- - 减法运算符,或负值运算符
- * 乘法运算符
- / 除法运算符
- % 模运算符,或称取余运算符,要求%两侧均为整型
2.关系运算符
- < 小于运算符
- <= 小于等于运算符
- > 大于运算符
- >= 大于等于运算符
- == 等于运算符
- != 不等于运算符
* 关系运算的结果成立就为"真"(比如5>=4),不成立则为"假"(比如5<4)
* 在Java中,关系运算的结果为"真"就返回true,"假"则返回false,用boolean类型的变量来接收
boolean b1 = 5 > 4; // true boolean b2 = 5 < 4; // false
C语言中没有boolean类型
* 在C语言中,关系运算的结果为"真"就返回1,"假"就返回0
int a1 = 5 > 4; // 1 int a2 = 5 < 4; // 0
* 还需注意的是,在C语言中,任何非0值都为"真",只有0值才为"假"
所以下面的做法是对的:
int a = 10; if (a) {
printf("条件成立");
} else {
printf("条件不成立");
}
因为a不为0,所以为"真",输出结果是:
若是在Java中,编译器直接报错了,因为if的括号()中只能放boolean类型的值。
以此类推,下面的写法也是对的:
int a = 10; if (a = 0) {
printf("条件成立");
} else {
printf("条件不成立");
}
上述代码是完全合理的,编译器不会报错,只是个警告而已。因为a为0,所以为"假",输出结果是:
这样看来,C语言似乎比Java方便很多,其实有很大的陷阱在这里:
假设你本来是想判断a是否为0,那么本应该写if (a == 0),若你误写成了if (a = 0),那将是一件非常可怕的事情,因为编译器又不报错,这样的BUG就难找了。因此,像a==0这样的表达式,最好写成0==a,若你误写成0=a,编译器会直接报错的。
// 不推荐
if (a == 0) {
} // 推荐
if (0 == a) {
}
* 在C语言中,可以不保存关系运算的结果
因此,下面的写法是合法的:
1 int a = 10;
2 a > 10;
3 a == 0;
如果是在Java中,第2、3行编译器会直接报错,但在C编译器看来是合法的,只是个警告。
所以,这里又是一个陷阱,假设你的本意是想给a赋值为0,那么本应该写a = 0; ,若你误写成a == 0; ,那将又是一个非常难找的BUG,因为编译器根本不会报错。在1993年的时候,这个BUG差点让一桩价值2000万美元的硬件产品生意告吹,因为如果这个BUG不解决,这个产品就没办法正常使用。
3.逻辑运算符
- && 逻辑与运算符
- || 逻辑或运算符
- ! 逻辑非运算符
逻辑运算的结果也只有两个:成立就为"真",返回1;不成立就为"假",返回0
4.赋值运算符
1.简单的赋值运算符 = :int a = 5;
2.复合赋值运算符
- += 加赋值运算符。如a += 3+1,等价于 a = a +(3+1)
- -= 减赋值运算符。如a -= 3+1,等价于 a = a -(3+1)
- *= 乘赋值运算符。如a *= 3+1,等价于 a = a *(3+1)
- /= 除赋值运算符。如a /= 3+1,等价于 a = a /(3+1)
- %= 取余赋值运算符。如a %= 3+1,等价于 a = a %(3+1)
5.自增运算符和自减运算符
- ++ 自增运算符。如a++,++a,都等价于a = a+1
- -- 自减运算符。如a--,--a,都等价于a = a-1
6.逗号运算符和逗号表达式
1 int a = 9;
2 int b = 10;
3
4 a = a+1 , b = 3*4;
* 用逗号运算符连接起来的表达式称为逗号表达式,它的一般形式为:
表达式1, 表达式2, … …, 表达式n
逗号表达式的运算过程是:从左到右的顺序,先计算表达式1,接着计算表达式2,...,最后计算表达式n
* 整个逗号表达式的值是最后一个表达式的值
1 int a = 2;
2 int b = 0;
3 int c;
4
5 c = (++a, a *= 2, b = a * 5);
6
7 printf("c = %d", c);
++a的结果为3,a *= 2的结果为6,b = a * 5的结果为30。因此,输出结果为:
这里要注意的是,右边的表达式是有用括号()包住的,如果不用括号包住,也就是:
c = ++a, a *= 2, b = a * 5;
printf("c = %d", c);
输出结果将为:,因为c = ++a也属于逗号表达式的一部分,跟后面的a *= 2以及b = a * 5是相互独立的
7.条件运算符和条件表达式
其实就是三目运算符,一般形式为:表达式1 ? 表达式2 : 表达式3
int a = (b > 5) ? 10 : 9;
8.sizeof
* sizeof可以用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
int size = sizeof(10);
printf("10所占的字节数:%d", size);
输出结果:,10是int类型的数据,在64bit编译器环境下,int类型需要占用4个字节
* sizeof一共有3种形式
- sizeof( 变量\常量 )
sizeof(10); char c = 'a';
sizeof(c);
- sizeof 变量\常量
sizeof 10; char c = 'a';
sizeof c;
- sizeof( 数据类型 )
sizeof(float);
注意,不可以写成sizeof float;
【C语言】07-基本语句和运算的更多相关文章
- 【下载分】C语言for循环语句PK自我活动
想了解自己C语言for语句的掌握程度吗?敢和自己PK较量一番吗?參加"C语言for循环语句PK自我活动",仅仅要成绩70分以上.就可赢得CSDN下载分. 12道题目题库动态读取,每 ...
- C语言第五讲,语句 顺序循环选择.
C语言第五讲,语句 顺序循环选择. 一丶语句的简明了解 我们知道,在编写C语言程序的时候,代码是顺序执行的. 从上往下执行. 但是我们可以控制流程的. 在控制之前,我们要先熟悉什么是语句. 相比大家学 ...
- C语言中一个语句太长用什么换行?
C语言中一个语句太长用什么换行? 5 C语言中一个语句太长用什么换行?比如我有一个printf语句很长很长,问了美观,我不想写在这一行了,要换到下一行,是不是在这行结尾的时候,要用个什么标识来表 ...
- GO学习-(36) Go语言在select语句中实现优先级
Go语言在select语句中实现优先级 Go语言在select语句中实现优先级 select语句介绍 Go 语言中的 select语句用于监控并选择一组case语句执行相应的代码.它看起来类似于swi ...
- C语言进阶——循环语句07
循环语句的基本工作方式: 通过条件表达式判定是否执行循环体 条件表达式遵循if语句表达式的原则 do,while,for的区别: do语句先执行后判断,循环体至少执行一次 while语句先判断后执行, ...
- C语言预处理条件语句的 与或运算
1.#ifdef 与或运算 #ifdef (MIN) && (MAX) ----------------------------错误使用 #if defined(MIN) & ...
- C语言07指针高级
01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_ ...
- javascript 核心语言笔记 5 - 语句
表达式在 JavaScript 中是短语(phrases),那么语句(statements)就是 JavaScript 整句或命令,语句以分号结束.表达式计算出一个值,语句用来执行以使某件事情发生 表 ...
- Java总结第一次//有些图片未显示,文章包含基础java语言及各种语句
一.java入门 1.Java入门学习框架: 2.常用的DOS命令: dir(directory) : 列出当前目录下的文件以及文件夹 md(make directory) : 创建目录 r ...
随机推荐
- iOS的 context 和Android 中的 canvas
ios 想要绘图,要用到CGContextRef类.最基本的用法是在- (void)drawRect:(CGRect)rect 函数中绘制. Android 中要用到Canvas类.最基本的用法是在 ...
- iOS 中的Push Notifications简单实现(APNS)
Android中的通知只有一种,就是Local Notifications,而iOS中除了Local Notifications外,还有一种Push Notifications.ios的这2种noti ...
- mybatis前台传给带年月日时分秒的数据给后台,后台接收不到时分秒
框架spring+springMVC+mybatis, 前台给后台传数据传不了时分秒,所以用springMVC的注解解决了,记录一下 controller中如下: /** * * 方法描述 : 使用@ ...
- 读取STL模型
读取二进制格式的STL模型文件 std::ifstream fin;fin.open(stlFilePath, std::ios::in | std::ios::binary);bool isBina ...
- Timer&TimerTask原理分析
转载地址,请珍惜作者的劳动成果,转载请注明出处:http://www.open-open.com/lib/view/open1337176725619.html 如果你使用Java语言进行开发,对于定 ...
- Android之解析GML并显示
本例主要实现在APP中解析GML数据并显示 GML,地理标记语言(外语全称:Geography MarkupLanguage.外语缩写:GML),它由开放式地理信息系统协会(外语缩写:OGC)于199 ...
- php 面向对象要点汇总
//类和对象//对象:一切东西都可以看做对象,对象是类的实例化.//类:类是对象的抽象,用来描述众多对象共有的特征. //定义类 class//成员变量 和 成员方法//访问修饰符 public共有的 ...
- oracle 10g 学习之多表查询、分组函数(6)
笛卡尔集 l 笛卡尔集会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 l 为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件. 自连接 select m.las ...
- hdu 1515 dfs
一道不错的搜索题 题意:告诉你两个字符串a和b,要求对a进行栈的操作而产生b串,输出操作的顺序,如果有多组输出就按字典序输出. Sample Input madam adamm bahama baha ...
- 无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)
转自:http://www.cnblogs.com/ManMonth/archive/2010/01/14/1648010.html 问题: 运行程序更新时出现报错: 无法获得锁 /var/lib/d ...