《C程序设计》(复习)
C语言教程包含内容
1.C语言简介
2.C语言环境配置
3.C语言变量
4.C语言分支判断
5.C语言指针
6.C语言结构体
7.C语言文件读写
8.C语言高级操作
9.C语言标准库
什么是C语言?
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
C语言能做什么
1.操作系统开发
2.软件开发
3.嵌入式开发
C语言有什么优点
1.可移植性:C语言是高度可移植的,你在不改动或者只做很小改动的情况下,就可以把C语言的程序运行在不同平台
2.C语言很小:C语言完全基于变量,宏命令,函数和架构,整体非常小,因此C语言可以嵌入几乎现代所有微型处理器中,从冰箱到闹钟
3.学会C学会一切:几乎所有编程语言都由C语言实现,或者有着和C语言一样相似的语法和逻辑规则,因此,学会C语言能使你很快学会其他语言
C语言有什么缺点
1.运行时间:C语言没有运行时间检查机制
2.面向过程:C语言不支持面向对象编程,这就是为什么创造C++
3.不安全:指针是C语言的一大特色,可以说是C语言优于其它高级语言的一个重要原因,但也就是因为它有指针,可以直接进行靠近硬件的操作,所以带来很多不安全的因素
c语言编程软件介绍
vc++6.0(Visual C++):Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世, vc++6.0(Visual C++):Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
TurboC/C++v3.0:Turbo C++ 3.0软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计 的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计的程序文件。
Dev-C++v5.10.0:Dev-C++ 是一个C++ 开发工具。它包括多页面窗口、工程编辑器,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序。它也提供高亮度语法显示的,以减少编辑错误。
Dev-C++是一个Windows下的C和C++程序的集成开发环境。它使用MingW32/GCC编译器,遵循C/C++标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示的,以减少编辑错误,还有完善的调试功能,能够适合初学者与编程高手的不同需求,是学习C或C++的首选开发工具!
CMake:CMake是一个免费的多平台编译工具,旨在构建、测试和软件打包。CMake是用于控制软件使用简单的平台和编译器编译过程独立配置文件。CMake生成本机makefile和工作区,可以使用您所选择的编译器环境。
C-Free:C-Free是一款支持多种编译器的专业化C/C++集成开发环境(IDE)。利用本软件,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序。C-Free 4 较之前的版本有巨大改进。
C语言有哪些知名应用
1.Amazon Kindle
2.Linux操作系统
3.OpenGL
C 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。
算术运算符
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | A-- 将得到 9 |
实例
请看下面的实例,了解 C 语言中所有可用的算术运算符:
#include <stdio.h> main() { int a = 21; int b = 10; int c ; c = a + b; printf("Line 1 - c 的值是 %d\n", c ); c = a - b; printf("Line 2 - c 的值是 %d\n", c ); c = a * b; printf("Line 3 - c 的值是 %d\n", c ); c = a / b; printf("Line 4 - c 的值是 %d\n", c ); c = a % b; printf("Line 5 - c 的值是 %d\n", c ); c = a++; printf("Line 6 - c 的值是 %d\n", c ); c = a--; printf("Line 7 - c 的值是 %d\n", c ); }
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - c 的值是 31 Line 2 - c 的值是 11 Line 3 - c 的值是 210 Line 4 - c 的值是 2 Line 5 - c 的值是 1 Line 6 - c 的值是 21 Line 7 - c 的值是 22
以下实例演示了 a++ 与 ++a 的区别:
实例
#include <stdio.h>
int main()
{
int c;
int a = 10;
c = a++;
printf("先赋值后运算:\n");
printf("Line 1 - c 的值是 %d\n", c );
printf("Line 2 - a 的值是 %d\n", a );
a = 10;
c = a--;
printf("Line 3 - c 的值是 %d\n", c );
printf("Line 4 - a 的值是 %d\n", a );
printf("先运算后赋值:\n");
a = 10;
c = ++a;
printf("Line 5 - c 的值是 %d\n", c );
printf("Line 6 - a 的值是 %d\n", a );
a = 10;
c = --a;
printf("Line 7 - c 的值是 %d\n", c );
printf("Line 8 - a 的值是 %d\n", a );
}
以上程序执行输出结果为:
先赋值后运算: Line 1 - c 的值是 10 Line 2 - a 的值是 11 Line 3 - c 的值是 10 Line 4 - a 的值是 9 先运算后赋值: Line 5 - c 的值是 11 Line 6 - a 的值是 11 Line 7 - c 的值是 9 Line 8 - a 的值是 9
关系运算符
下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
实例
请看下面的实例,了解 C 语言中所有可用的关系运算符:
#include <stdio.h> main() { int a = 21; int b = 10; int c ; if( a == b ) { printf("Line 1 - a 等于 b\n" ); } else { printf("Line 1 - a 不等于 b\n" ); } if ( a < b ) { printf("Line 2 - a 小于 b\n" ); } else { printf("Line 2 - a 不小于 b\n" ); } if ( a > b ) { printf("Line 3 - a 大于 b\n" ); } else { printf("Line 3 - a 不大于 b\n" ); } /* 改变 a 和 b 的值 */ a = 5; b = 20; if ( a <= b ) { printf("Line 4 - a 小于或等于 b\n" ); } if ( b >= a ) { printf("Line 5 - b 大于或等于 b\n" ); } }
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - a 不等于 b Line 2 - a 不小于 b Line 3 - a 大于 b Line 4 - a 小于或等于 b Line 5 - b 大于或等于 b
逻辑运算符
下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
实例
请看下面的实例,了解 C 语言中所有可用的逻辑运算符:
#include <stdio.h> main() { int a = 5; int b = 20; int c ; if ( a && b ) { printf("Line 1 - 条件为真\n" ); } if ( a || b ) { printf("Line 2 - 条件为真\n" ); } /* 改变 a 和 b 的值 */ a = 0; b = 10; if ( a && b ) { printf("Line 3 - 条件为真\n" ); } else { printf("Line 3 - 条件不为真\n" ); } if ( !(a && b) ) { printf("Line 4 - 条件为真\n" ); } }
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - 条件为真 Line 2 - 条件为真 Line 3 - 条件不为真 Line 4 - 条件为真
位运算符
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
运算符 | 描述 | 实例 |
---|---|---|
& | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 | (A & B) 将得到 12,即为 0000 1100 |
| | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 | (A | B) 将得到 61,即为 0011 1101 |
^ | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 | (A ^ B) 将得到 49,即为 0011 0001 |
~ | 二进制补码运算符是一元运算符,具有"翻转"位效果。 | (~A ) 将得到 -61,即为 1100 0011,2 的补码形式,带符号的二进制数。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 将得到 15,即为 0000 1111 |
实例
请看下面的实例,了解 C 语言中所有可用的位运算符:
#include <stdio.h> main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ printf("Line 1 - c 的值是 %d\n", c ); c = a | b; /* 61 = 0011 1101 */ printf("Line 2 - c 的值是 %d\n", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("Line 3 - c 的值是 %d\n", c ); c = ~a; /*-61 = 1100 0011 */ printf("Line 4 - c 的值是 %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("Line 5 - c 的值是 %d\n", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("Line 6 - c 的值是 %d\n", c ); }
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - c 的值是 12 Line 2 - c 的值是 61 Line 3 - c 的值是 49 Line 4 - c 的值是 -61 Line 5 - c 的值是 240 Line 6 - c 的值是 15
赋值运算符
下表列出了 C 语言支持的赋值运算符:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
实例
请看下面的实例,了解 C 语言中所有可用的赋值运算符:
#include <stdio.h> main() { int a = 21; int c ; c = a; printf("Line 1 - = 运算符实例,c 的值 = %d\n", c ); c += a; printf("Line 2 - += 运算符实例,c 的值 = %d\n", c ); c -= a; printf("Line 3 - -= 运算符实例,c 的值 = %d\n", c ); c *= a; printf("Line 4 - *= 运算符实例,c 的值 = %d\n", c ); c /= a; printf("Line 5 - /= 运算符实例,c 的值 = %d\n", c ); c = 200; c %= a; printf("Line 6 - %= 运算符实例,c 的值 = %d\n", c ); c <<= 2; printf("Line 7 - <<= 运算符实例,c 的值 = %d\n", c ); c >>= 2; printf("Line 8 - >>= 运算符实例,c 的值 = %d\n", c ); c &= 2; printf("Line 9 - &= 运算符实例,c 的值 = %d\n", c ); c ^= 2; printf("Line 10 - ^= 运算符实例,c 的值 = %d\n", c ); c |= 2; printf("Line 11 - |= 运算符实例,c 的值 = %d\n", c ); }
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - = 运算符实例,c 的值 = 21 Line 2 - += 运算符实例,c 的值 = 42 Line 3 - -= 运算符实例,c 的值 = 21 Line 4 - *= 运算符实例,c 的值 = 441 Line 5 - /= 运算符实例,c 的值 = 21 Line 6 - %= 运算符实例,c 的值 = 11 Line 7 - <<= 运算符实例,c 的值 = 44 Line 8 - >>= 运算符实例,c 的值 = 11 Line 9 - &= 运算符实例,c 的值 = 2 Line 10 - ^= 运算符实例,c 的值 = 0 Line 11 - |= 运算符实例,c 的值 = 2
杂项运算符sizeof & ? :
下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 |
& | 返回变量的地址。 | &a; 将给出变量的实际地址。 |
* | 指向一个变量。 | *a; 将指向一个变量。 |
? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
实例
请看下面的实例,了解 C 语言中所有可用的杂项运算符:
#include <stdio.h> main() { int a = 4; short b; double c; int* ptr; /* sizeof 运算符实例 */ printf("Line 1 - 变量 a 的大小 = %d\n", sizeof(a) ); printf("Line 2 - 变量 b 的大小 = %d\n", sizeof(b) ); printf("Line 3 - 变量 c 的大小 = %d\n", sizeof(c) ); /* & 和 * 运算符实例 */ ptr = &a; /* 'ptr' 现在包含 'a' 的地址 */ printf("a 的值是 %d\n", a); printf("*ptr 是 %d\n", *ptr); /* 三元运算符实例 */ a = 10; b = (a == 1) ? 20: 30; printf( "b 的值是 %d\n", b ); b = (a == 10) ? 20: 30; printf( "b 的值是 %d\n", b ); }
当上面的代码被编译和执行时,它会产生下列结果:
a 的值是 4 *ptr 是 4 b 的值是 30 b 的值是 20
C 中的运算符优先级
运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。
例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。
下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
实例
请看下面的实例,了解 C 语言中运算符的优先级:
#include <stdio.h> main() { int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 printf("(a + b) * c / d 的值是 %d\n", e ); e = ((a + b) * c) / d; // (30 * 15 ) / 5 printf("((a + b) * c) / d 的值是 %d\n" , e ); e = (a + b) * (c / d); // (30) * (15/5) printf("(a + b) * (c / d) 的值是 %d\n", e ); e = a + (b * c) / d; // 20 + (150/5) printf("a + (b * c) / d 的值是 %d\n" , e ); return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
(a + b) * c / d 的值是 90 ((a + b) * c) / d 的值是 90 (a + b) * (c / d) 的值是 90 a + (b * c) / d 的值是 50
学习C - C关键字
在标准ANSI C编程语言中有32个字被定义为关键字。
这些关键字具有预定义的用途,不能用于C程序中的任何其他目的。
编译器使用这些关键字。
关键词 | 描述 |
---|---|
auto | 将局部变量定义为具有局部寿命 |
break | 将控制传递给编程结构 |
case | 分支控制 |
char | 基本数据类型 |
const | 不可修改的值 |
continue | 通过控制循环开始 |
default | 分支控制 |
do | Do While循环 |
double | 浮点数据类型 |
else | 条件语句 |
enum | 定义一组类型为int的常量 |
extern | 表示在别处定义的标识符 |
float | 浮点数据类型 |
for | For循环 |
goto | 无条件传输程序控制 |
if | 条件语句 |
int | 基本数据类型 |
long | 类型修饰符 |
register | 类型修饰符... |
return | 退出该函数 |
short | 类型修饰符 |
signed | 类型修饰符 |
sizeof | 返回表达式或类型大小 |
static | 在范围结束后保留变量值 |
struct | 将变量分组到单个记录中 |
switch | 分支控制 |
typedef | 创建新类型 |
union | 组变量占用相同的存储空间 |
unsigned | 类型修饰符 |
void | 空数据类型 |
volatile | 允许变量由后台例程更改 |
while | 当条件为真时,重复程序执行 |
例子
#include <stdio.h>
int main(void)
{ /* w ww . j av a 2 s . com*/
float fRevenue, fCost;
fRevenue = 0;
fCost = 0;
/* profit = revenue - cost */
printf("\nEnter total revenue: ");
scanf("%f", &fRevenue);
printf("\nEnter total cost: ");
scanf("%f", &fCost);
printf("\nYour profit is $%.2f\n", fRevenue - fCost);
return 0;
}
上面的代码生成以下结果。
注意
使用字符作为菜单选项。
#include <stdio.h>
int main(void)
{ /* w ww . j av a 2 s . c o m*/
char cResponse = "\0";
printf("\n\tAC Control Unit\n");
printf("\na\tTurn the AC on\n");
printf("b\tTurn the AC off\n");
printf("\nEnter your selection: ");
scanf("%c", &cResponse);
if (cResponse == "a")
printf("\nAC is now on\n");
if (cResponse == "b")
printf("\nAC is now off\n");
return 0;
}
上面的代码生成以下结果。
学习C - C算术运算符
C支持四个基本算术运算,如加,减,乘法和除法。
算术语句具有以下形式:
variable_name = arithmetic_expression;
=运算符右侧的算术表达式指定计算使用存储在变量或中的值使用算术运算符组合的显式数字例如加法(+),减法( - ),乘法(*),和除法(/)。
total_count = birds + tigers + pigs + others;
下表列出了基本算术运算符。
操作员 | 行动 |
---|---|
+ | Addition |
- | Subtraction |
* | Multiplication |
/ | Division |
% | Modulus |
运算符应用于的值称为操作数。需要两个操作数的运算符,例如作为%
,被称为二元运算符。
应用于单个值的运算符称为一元运算符。 因此 - 是一个二进制表达式a - b中的运算符和表达式-data中的一元运算符。
#include <stdio.h>
//from www. ja v a2 s . c om
int main(void)
{
int cakes = 5;
int CALORIES = 125; // Calories per cookie
int total_eaten = 0;
int eaten = 2;
cakes = cakes - eaten;
total_eaten = total_eaten + eaten;
printf("I have eaten %d cakes. There are %d cakes left", eaten, cakes);
eaten = 3; // New value for cakes eaten
cakes = cakes - eaten;
total_eaten = total_eaten + eaten;
printf("\nI have eaten %d more. Now there are %d cakes left\n", eaten, cakes);
printf("\nTotal energy consumed is %d calories.\n", total_eaten * CALORIES);
return 0;
}
上面的代码生成以下结果。
例子
以下是基本算术的代码说明:
#include <stdio.h>
/*from w w w . j a va2 s. com*/
int main() {
int a,b,c;
a = 10;
b = 6;
c = a + b;
printf("%d + %d = %d\n",a,b,c);
c = a - b;
printf("%d - %d = %d\n",a,b,c);
c = a * b;
printf("%d * %d = %d\n",a,b,c);
float d = a / b;
printf("%d / %d = % .2f\n",a,b,d);
float e =(float)a / b;
printf("%d / %d = % .2f\n",a,b,e);
return 0;
}
上面的代码生成以下结果。
部门和模块操作员
假设你有45个蛋糕和一组七个孩子。
你会把蛋糕均等地分开孩子,并计算出每个孩子有多少。
然后你会“找出剩下多少个蛋糕。
#include <stdio.h>
/* www.ja va 2 s . c om*/
int main(void) {
int cakes = 45;
int children = 7;
int cakes_per_child = 0;
int cakes_left_over = 0;
// Calculate how many cakes each child gets when they are divided up
cakes_per_child = cakes/children;
printf("%d children and %d cakes\n", children, cakes);
printf("each child has %d cakes.\n", cakes_per_child);
cakes_left_over = cakes%children;
printf("%d cakes left over.\n", cakes_left_over);
return 0;
}
上面的代码生成以下结果。
op =作业形式
C是一种非常简洁的语言,它为您提供了指定某些操作的简略方法。
考虑下面的语句:
number = number + 10;
这种分配有一个简写版本:
number += 10;
变量名后的+ =运算符是op =运算符族的一个示例。
这个语句与前一个语句有完全相同的效果,并节省了一点打字。
op in中的op可以是以下任何算术运算符:
+ - * / %
如果你假设number的值为10,你可以写下面的语句:
number *= 3; // number will be set to number*3 which is 30 number /= 3; // number will be set to number/3 which is 3 number %= 3; // number will be set to number%3 which is 1
在 op =
中的op也可以是你还没有遇到的一些其他操作符:
<< >> & ^ |
op =
操作符集合的工作方式总是相同的。
使用 op =
的语句的一般形式:
lhs op= rhs;
其中rhs表示op =运算符右侧的任何表达式。
效果与以下语句形式相同:
lhs = lhs op (rhs);
首先,考虑这个声明:
variable *= 12;
这是相同的:
variable = variable * 12;
现在有两种不同的方式将整数变量递增1。
以下两个语句都加1:
count = count + 1; count += 1;
因为op in op =适用于评估rhs表达式的结果,语句:
a /= b + 1;
是相同的
a = a/(b + 1);
我们知道的分裂
#include <stdio.h>
int main(void)
{ /*from w w w. j av a 2s . com*/
printf("integer division: 5/4 is %d \n", 5/4);
printf("integer division: 6/3 is %d \n", 6/3);
printf("integer division: 7/4 is %d \n", 7/4);
printf("floating division: 7./4. is %1.2f \n", 7./4.);
printf("mixed division: 7./4 is %1.2f \n", 7./4);
return 0;
}
上面的代码生成以下结果。
实施例2
下面的代码显示了如何编写一个简单的计算器它可以加,减,乘,除,当找到余数数字除以另一个。
#include <stdio.h>
/*from www .j a va 2s .c o m*/
int main(void) {
double number1 = 0.0; //* First operand value a decimal number *//
double number2 = 0.0; //* Second operand value a decimal number *//
char operation = 0; //* Operation - must be +, -, *, /, or % *//
printf("\nEnter the calculation(eg. 1+2)\n");
scanf("%lf %c %lf", &number1, &operation, &number2);
switch(operation)
{
case "+": // No checks necessary for add
printf("= %lf\n", number1 + number2);
break;
case "-": // No checks necessary for subtract
printf("= %lf\n", number1 - number2);
break;
case "*": // No checks necessary for multiply
printf("= %lf\n", number1 * number2);
break;
case "/":
if(number2 == 0) // Check second operand for zero
printf("\n\n\aDivision by zero error!\n");
else
printf("= %lf\n", number1 / number2);
break;
case "%": // Check second operand for zero
if((long)number2 == 0)
printf("\n\n\aDivision by zero error!\n");
else
printf("= %ld\n", (long)number1 % (long)number2);
break;
default: // Operation is invalid if we get to here
printf("\n\n\aIllegal operation!\n");
break;
}
return 0;
}
上面的代码生成以下结果。
学习C - C变量
变量是保存一个或多个连续字节的特定内存块。
程序中的每个变量都有一个名称,它将对应于变量的内存地址。
我们使用变量名称将数据值存储在内存中或检索内存中包含的数据。
以下代码将字符串中的值10硬编码。 它不使用变量。
#include <stdio.h>
int main(void)
{
printf("My salary is $10.");
return 0;
}
上面的代码生成以下结果。
命名变量
变量名称是一个或多个大写或小写字母,数字,和以字母开头的下划线字符(_)。
合法变量名称的示例如下:
半径直径Current_Maymy_ResultD123
变量名称不能以数字开头,因此8_value和6_size不是合法名称。
变量名称不能包括字母,下划线和数字以外的字符。
声明变量
要声明一个名为myvar1的变量,请写下:
int myvar1;
int
是数据类型。
以下是可以在C语言中使用的通用数据类型的列表。
int long float char double
我们还可以写如下的许多变量:
int myvar1, myvar2;
一旦声明,这些变量可以用于存储基于数据类型的数据。
分配变量
您声明的变量可以通过值分配。
它可以使用等号(=)。
例如,变量myvar1将分配数字100,您可以这样写:
int myvar1 = 100;
您还声明如下
int myvar1; myvar1 = 100;
您必须根据数据类型正确地为变量分配值。
如果没有,你会得到编译过程中的错误。
示例:使用变量
您可以重写上一个程序以使用int类型的变量,这是一个整数类型:
#include <stdio.h>
int main(void) {
int salary; // Declare a variable called salary
salary = 10000; // Store 10000 in salary
printf("My salary is %d.\n", salary);
return 0;
}
上面的代码生成以下结果。
注意
标识您“用于存储您的薪水的内存的语句如下:
int salary; // Declare a variable called salary
此语句称为变量声明,因为它声明变量的名称。
在这种情况下,名称是工资。
变量声明以分号结尾。
变量声明还指定变量将存储的数据类型。
你使用关键字int来指定变量 salary
将用于存储int类型的整数值。
关键字 int
在变量名称之前。
这只是您可以用来存储整数的几种不同类型之一。
关键词是在C中保留的具有特殊含义的词。
您不能将关键字用作代码中的变量或其他实体的名称。
如果这样做,您的编译器将产生错误消息。
下一个语句是:
salary = 10000; // Store 10000 in salary
这是一个简单的算术赋值语句。
它取等号右边的值并存储它在等号左边的变量中。
=
符号称为赋值运算符,因为它分配左边的变量右边的值。
注意...
printf()语句:
printf("My salary is %d.\n", salary);
括号中有两个参数,用逗号分隔。
参数是传递给函数的值。
printf()
函数的两个参数是:
第一个参数是一个控制字符串,它控制输出的方式由以下参数指定的参数。
它也称为格式字符串。
第二个参数是变量名称salary。
第一个参数中的控制字符串确定如何显示工资值。
%d
被称为变量值的转换说明符。
转换说明符确定变量值在屏幕上的显示方式。
d
是应用于整数值的十进制说明符。
这意味着第二个参数salary将被表示并输出为十进制(基数10)数。
转换说明符总是以%字符开头,以便printf()函数可以识别它们。
因为控制字符串中的%总是表示转换说明符的开始,当您要输出%字符时,必须使用转义序列%%。
以下代码显示如何使用两个转换说明符。
#include <stdio.h>
//from w ww.java2 s . c o m
int main(void)
{
int chair;
int table;
chair = 2;
table = 3;
// Display some output
printf("%d table for %d chair\n", table, chair);
return 0;
}
你首先声明两个变量,table和主席,这些声明:
int chair; // Declare a variable called chair int table; // and a variable called table
您可以将两个变量指定为 int
类型它们都只能存储整数值。
它们已在单独的声明中声明。
因为它们都是相同的类型,你可以保存一行的代码并将它们一起声明如下:
int chair, table;
接下来的两个语句将值分配给每个变量:
chair = 2; table = 3;
上面的代码生成以下结果。
示例:使用变量
该程序使用变量的值进行简单计算:
#include <stdio.h>
//from w w w. j a va 2 s.com
int main(void)
{
int total_count;
int birds;
int tigers;
int pigs;
int others;
birds = 26;
tigers = 13;
pigs = 541;
others = 46;
// Calculate the total number
total_count = birds + tigers + pigs + others;
printf("We have %d in total\n", total_count); // Output the result
return 0;
}
上面的代码生成以下结果。
正在初始化变量
在前面的示例中,您使用如下语句声明每个变量:
int birds; // The number of birds as pets
您使用此语句设置变量birds的值:
birds = 2;
这将birds的值设置为2。
第一个语句创建了名为birds的变量,但它的值将是任何值留在内存中使用这个内存的最后一个程序。
我们可以在声明它时初始化变量。
您可以使用以下语句执行此操作:
int birds = 2;
此语句将bird声明为int类型,并将其初始值设置为2。
学习C - C比较运算符
您可以确定变量或值之间的相等和差异。
您有六个关系运算符,用于比较两个值,如下表所示。
操作员 | 含义 |
---|---|
== | 等于 |
!= | 不相等 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
每个这些操作都会产生一个int类型的值。
如果比较为真,则每个操作的结果为1如果比较为假则为0。
例子
这是用于比较使用的示例代码
#include <stdio.h>
/*from w w w. j a v a2s. c om*/
int main() {
int a,b;
a = 10;
b = 6;
printf("%d == %d = %d\n",a,b,a==b);
printf("%d != %d = %d\n",a,b,a!=b);
printf("%d > %d = %d\n",a,b,a>b);
printf("%d < %d = %d\n",a,b,a<b);
printf("%d >= %d = %d\n",a,b,a>=b);
printf("%d <= %d = %d\n",a,b,a<=b);
return 0;
}
上面的代码生成以下结果。
学习C - C常量
定义命名常量
PI是一个数学常数。我们可以将Pi定义为在编译期间要在程序中被其值替换的符号。
#include <stdio.h>
#define PI 3.14159f // Definition of the symbol PI
//from ww w . j a va 2 s. co m
int main(void)
{
float radius = 0.0f;
float diameter = 0.0f;
float circumference = 0.0f;
float area = 0.0f;
printf("Input the diameter of a table:");
scanf("%f", &diameter);
radius = diameter/2.0f;
circumference = 2.0f*PI*radius;
area = PI*radius*radius;
printf("\nThe circumference is %.2f. ", circumference);
printf("\nThe area is %.2f.\n", area);
return 0;
}
上面的代码生成以下结果。
注意
以上代码中的以下行为PI定义了一个常量值。
#define PI 3.14159f // Definition of the symbol PI
这将PI定义为将在代码中由字符串3.14159f替换的符号。
它是C中的一个常见惯例,用于以大写字母编写出现在#define伪指令中的标识符。
在引用PI的地方,预处理器将替换字符串您已在#define指令中指定。
所有的替换将在编译程序之前进行。
我们还可以将Pi定义为变量,但告诉编译器它的值是固定的,不能是改变。
您可以通过在类型名称前添加关键字来声明任何变量的值const。
例如:
const float Pi = 3.14159f; // Defines the value of Pi as fixed
这样,我们可以将PI定义为一个常数值指定类型。
对于Pi的关键字const使编译器检查代码不尝试更改其值。
const
您可以在上一个示例的变体中使用const变量:
#include <stdio.h>
/*from w w w . jav a 2 s. co m*/
int main(void)
{
float diameter = 0.0f; // The diameter of a table
float radius = 0.0f; // The radius of a table
const float Pi = 3.14159f; // Defines the value of Pi as fixed
printf("Input the diameter of the table:");
scanf("%f", &diameter);
radius = diameter/2.0f;
printf("\nThe circumference is %.2f.", 2.0f*Pi*radius);
printf("\nThe area is %.2f.\n", Pi*radius*radius);
return 0;
}
上面的代码生成以下结果。
学习C - C递增递减运算符
const...
int number = 6;
您可以使用以下语句将其增加1:
++number; // Increase the value by 1
执行此语句后,number将包含值7。
同样,您可以减少number的值由1与以下语句:
--number; // Decrease the value by 1
这些增量和减量运算符都是一元运算符,这意味着它们只能重用一个操作数。
它们将int值增加或减少1。
如果在表达式中写入count ++,则count的增量发生在它的值之后用过的。
想象一下你的操作如下
num = num + 1;
你可以简单地使用这个语法使用++
。
num++;
在这种情况下使用相同的方法
num = num - 1;
你可以使用 - 语法。
num--;
#include <stdio.h>
int main(void)
{ //w w w . ja v a 2s.com
int ultra = 0, super = 0;
while (super < 5)
{
super++;
++ultra;
printf("super = %d, ultra = %d \n", super, ultra);
}
return 0;
}
上面的代码生成以下结果。
例子
现在如何在代码中实现它们。 让我们写这段代码。
#include <stdio.h>
/*w w w . j a v a 2 s . c o m*/
int main() {
int a = 10;
a++;
printf("%d \n",a);
a++;
printf("%d \n",a);
++a;
printf("%d \n",a);
a--;
printf("%d \n",a);
a--;
printf("%d \n",a);
--a;
printf("%d \n",a);
return 0;
}
上面的代码生成以下结果。
注意
您可以将增量运算符放在变量的右侧,如下所示。
x++;
该表达式告诉C使用变量x的当前值,并将其增量1。
变量的原始值为0,1被添加到0,结果为1。
另一种使用增量运算符的方法是将它放在变量的前面或左边,如下所示。
++x;
相对于更改增量运算符的位置(后缀对前缀)该变量在评估时产生不同的结果。
放置增量运算符时在变量的左边,它会先使变量的内容递增1,然后再使用另一个表达式。
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
printf("\nThe value of y is %d\n", y++);
printf("\nThe value of x is %d\n", ++x);
return 0;
}
在上面的第一个printf()函数中,C首先处理printf()的输出然后增加变量y。
在第二个语句中,C先增加x变量,然后再增加处理printf()函数,从而揭示变量的新值。
上面的代码生成以下结果。
笔记2
以下程序进一步演示了增量操作符放置。
#include <stdio.h>
int main() //w ww .j a va 2s . c o m
{
int x = 0;
int y = 1;
x = y++ * 2; //increments x after the assignment
printf("\nThe value of x is: %d\n", x);
x = 0;
y = 1;
x = ++y * 2; //increments x before the assignment
printf("The value of x is: %d\n", x);
return 0;
} //end main function
上面的程序将产生以下输出。
- 操作员
- 运算符类似于增量运算符(++),但是不是递增数字 - 基于变量,它将它们减1。
减量运算符可以放在变量的两侧(前缀和后缀),如下所示。
--x; x--;
下一个代码块使用decrement操作符以两种方式演示如何,基于变量可以递减1。
#include <stdio.h>
main() //from w ww . j a va 2 s . c o m
{
int x = 1;
int y = 1;
x = y-- * 4;
printf("\nThe value of x is %d\n", x);
y = 1; //reset variable value for demonstration purposes
x = --y * 4;
printf("\nThe value of x is now %d\n", x);
}
上面的代码生成以下结果。
了解C - C数据类型
下表总结了变量类型。
类型 | 典型字节数 | 典型字节数... |
---|---|---|
char | 1 | -128至+127或0至+255 |
无符号字符 | 1 | 0至+255 |
short | 2 | -32,768至+32,767 |
无符号短 | 2 | 0至+65,535 |
int | 2或4 | -32,768至+32,767或-2,147,438,648至+2,147,438,647 |
unsigned int | 4 | 0至+65,535或0至+4,294,967,295 |
long | 4 | -2,147,438,648至+2,147,438,647 |
unsigned long | 4 | 0至+4,294,967,295 |
长长 | 8 | -9,223,372,036,854,775,808至+9,223,372,036,854,775,807 |
unsigned long long | 8 | 0至+18,446,744,073,709,551,615 |
float | 4 | +/- 3.4E +/- 38(6位数) |
double | 8 | +/- 1.7E +/- 308(15位数) |
长双 | 12 | +/- 1.2E +/- 4932(19位数) |
局限性
一些符号常量from limits.h
符号常数 | 代表 |
---|---|
CHAR_BIT | 字符中的位数 |
CHAR_MAX | 最大字符值 |
CHAR_MIN | 最小字符值 |
SCHAR_MAX | 最大签名字符值 |
SCHAR_MIN | 最小签名字符值 |
UCHAR_MAX | 最大无符号字符值 |
SHRT_MAX | 最大短值 |
SHRT_MIN | 最小短值 |
USHRT_MAX | 最大无符号短整型值 |
INT_MAX | 最大int值 |
INT_MIN | 最小int值 |
UINT_MAX | 最大无符号整数值 |
LONG_MAX | 最大长整数值 |
LONG_MIN | 最小长值 |
ULONG_MAX | 最大无符号长整型值 |
LLONG_MAX | 最大长整型值 |
LLONG_MIN | 最小长整型值 |
ULLONG_MAX | 最大unsigned long long值 |
使用从limit.h和float定义的常量。
#include <stdio.h>
#include <limits.h> // integer limits
#include <float.h> // floating-point limits
int main(void)
{ //from ww w. ja va 2 s . c om
printf("Some number limits for this system:\n");
printf("Biggest int: %d\n", INT_MAX);
printf("Smallest long long: %lld\n", LLONG_MIN);
printf("One byte = %d bits on this system.\n", CHAR_BIT);
printf("Largest double: %e\n", DBL_MAX);
printf("Smallest normal float: %e\n", FLT_MIN);
printf("float precision = %d digits\n", FLT_DIG);
printf("float epsilon = %e\n", FLT_EPSILON);
return 0;
}
上面的代码生成以下结果。
例子
将2英尺转换为英尺
#include <stdio.h>
int main(void)
{//from ww w .ja va 2 s. c om
int feet, fathoms;
fathoms = 2;
feet = 6 * fathoms;
printf("There are %d feet in %d fathoms!\n", feet, fathoms);
printf("Yes, I said %d feet!\n", 6 * fathoms);
return 0;
}
上面的代码生成以下结果。
实施例2
以下代码显示如何从命令行读取int值。
#include <stdio.h>
int main(void)
{//from w w w. java 2s .c om
int dogs;
printf("How many dogs do you have?\n");
scanf("%d", &dogs);
printf("So you have %d dog(s)!\n", dogs);
return 0;
}
上面的代码生成以下结果。
实施例3
以下代码显示如何使用整数类型的可移植名称。
/* w w w.ja v a2 s. c o m*/
#include <stdio.h>
#include <inttypes.h> // supports portable types
int main(void)
{
int32_t me32; // me32 a 32-bit signed variable
me32 = 45933945;
printf("First, assume int32_t is int: ");
printf("me32 = %d\n", me32);
printf("Next, let"s not make any assumptions.\n");
printf("Instead, use a \"macro\" from inttypes.h: ");
printf("me32 = %" PRId32 "\n", me32);
return 0;
}
上面的代码生成以下结果。
实施例4
下面的代码显示了如何以十进制,八进制和十六进制打印100。
#include <stdio.h>
int main(void)
{//ww w .j av a 2 s . co m
int x = 100;
printf("dec = %d; octal = %o; hex = %x\n", x, x, x);
printf("dec = %d; octal = %#o; hex = %#x\n", x, x, x);
return 0;
}
上面的代码生成以下结果。
实施例5
下面的代码声明和使用各种int类型。
/* ww w .j a v a 2s .co m*/
#include <stdio.h>
int main(void)
{
unsigned int un = 3000000000; /* system with 32-bit int */
short end = 200; /* and 16-bit short */
long big = 65537;
long long verybig = 12345678908642;
printf("un = %u and not %d\n", un, un);
printf("end = %hd and %d\n", end, end);
printf("big = %ld and not %hd\n", big, big);
printf("verybig= %lld and not %ld\n", verybig, verybig);
return 0;
}
上面的代码生成以下结果。
实施例6
下面的代码以两种方式显示浮点值。
#include <stdio.h>
int main(void)
{/*from ww w .ja va2 s . c o m*/
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
// next line requires C99 or later compliance
printf("And it"s %a in hexadecimal, powers of 2 notation\n", aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be written %Le\n", dip, dip);
return 0;
}
上面的代码生成以下结果。
实施例7
以下代码显示如果值超过最大int大小会发生什么。
#include <stdio.h>
int main(void)
{//from w w w. ja va2 s . co m
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d\n", i, i+1, i+2);
printf("%u %u %u\n", j, j+1, j+2);
return 0;
}
上面的代码生成以下结果。
实施例8
以下代码打印出类型大小。
#include <stdio.h>
int main(void)
{//from www . j a va 2s . c om
/* c99 provides a %zd specifier for sizes */
printf("Type int has a size of %zd bytes.\n", sizeof(int));
printf("Type char has a size of %zd bytes.\n", sizeof(char));
printf("Type long has a size of %zd bytes.\n", sizeof(long));
printf("Type long long has a size of %zd bytes.\n",
sizeof(long long));
printf("Type double has a size of %zd bytes.\n",
sizeof(double));
printf("Type long double has a size of %zd bytes.\n",
sizeof(long double));
return 0;
}
上面的代码生成以下结果。
实施例9
#include <stdio.h>
#include <stdint.h>
#include <wchar.h>
#include <limits.h>
#include <float.h>
#include <math.h>
int main(void)
{// w w w. ja v a 2 s.c om
printf("PTRDIFF_MIN = %td\n", PTRDIFF_MIN);
printf("PTRDIFF_MAX = %+td\n", PTRDIFF_MAX);
printf("SIZE_MAX = %zu\n", SIZE_MAX);
printf("SIG_ATOMIC_MIN = %+jd\n",(intmax_t)SIG_ATOMIC_MIN);
printf("SIG_ATOMIC_MAX = %+jd\n",(intmax_t)SIG_ATOMIC_MAX);
printf("WCHAR_MIN = %+jd\n",(intmax_t)WCHAR_MIN);
printf("WCHAR_MAX = %+jd\n",(intmax_t)WCHAR_MAX);
printf("WINT_MIN = %jd\n", (intmax_t)WINT_MIN);
printf("WINT_MAX = %jd\n", (intmax_t)WINT_MAX);
printf("CHAR_BIT = %d\n", CHAR_BIT);
printf("MB_LEN_MAX = %d\n", MB_LEN_MAX);
printf("\n");
printf("CHAR_MIN = %+d\n", CHAR_MIN);
printf("CHAR_MAX = %+d\n", CHAR_MAX);
printf("SCHAR_MIN = %+d\n", SCHAR_MIN);
printf("SCHAR_MAX = %+d\n", SCHAR_MAX);
printf("UCHAR_MAX = %u\n", UCHAR_MAX);
printf("\n");
printf("SHRT_MIN = %+d\n", SHRT_MIN);
printf("SHRT_MAX = %+d\n", SHRT_MAX);
printf("USHRT_MAX = %u\n", USHRT_MAX);
printf("\n");
printf("INT_MIN = %+d\n", INT_MIN);
printf("INT_MAX = %+d\n", INT_MAX);
printf("UINT_MAX = %u\n", UINT_MAX);
printf("\n");
printf("LONG_MIN = %+ld\n", LONG_MIN);
printf("LONG_MAX = %+ld\n", LONG_MAX);
printf("ULONG_MAX = %lu\n", ULONG_MAX);
printf("\n");
printf("LLONG_MIN = %+lld\n", LLONG_MIN);
printf("LLONG_MAX = %+lld\n", LLONG_MAX);
printf("ULLONG_MAX = %llu\n", ULLONG_MAX);
printf("\n");
printf("FLT_RADIX = %d\n", FLT_RADIX);
printf("DECIMAL_DIG = %d\n", DECIMAL_DIG);
printf("FLT_MIN = %e\n", FLT_MIN);
printf("FLT_MAX = %e\n", FLT_MAX);
printf("FLT_EPSILON = %e\n", FLT_EPSILON);
printf("FLT_DIG = %d\n", FLT_DIG);
printf("FLT_MANT_DIG = %d\n", FLT_MANT_DIG);
printf("FLT_MIN_EXP = %d\n", FLT_MIN_EXP);
printf("FLT_MIN_10_EXP = %d\n", FLT_MIN_10_EXP);
printf("FLT_MAX_EXP = %d\n", FLT_MAX_EXP);
printf("FLT_MAX_10_EXP = %d\n", FLT_MAX_10_EXP);
printf("FLT_ROUNDS = %d\n", FLT_ROUNDS);
printf("FLT_EVAL_METHOD = %d\n", FLT_EVAL_METHOD);
}
上面的代码生成以下结果。
学习C - C逻辑运算符
这些运算符可用于确定变量或值之间的逻辑。
操作员 | 含义 |
---|---|
&& | and |
|| | or |
! | not |
AND运算符&
逻辑AND运算符&&是二进制运算符组合两个逻辑表达式,即两个表达式评估为真或假。
考虑这个表达式:
test1 && test2
如果表达式test1和test2的值都为true,则此表达式的值为true。
如果任一或两个操作数都为假,则操作的结果为假。
明显的地方使用&& 运算符在if表达式中。 这里举个例子:
if(age > 12 && age < 20) {
printf("You are a teenager.");
}
仅当age的值为13到19(含)时,才执行printf()语句。
当然,&& 运算符可以是bool变量。
您可以用以下语句替换上一条语句:
bool test1 = age > 12;
bool test2 = age < 20;
if(test1 && test2) {
printf("You are a teenager.");
}
和操作员的真相表
X | y | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
使用逻辑AND运算符
#include <stdio.h>
#define PERIOD "."
int main(void)
{/* w w w . java2 s . c om*/
char ch;
int charcount = 0;
while ((ch = getchar()) != PERIOD)
{
if (ch != """ && ch != "\"")
charcount++;
}
printf("There are %d non-quote characters.\n", charcount);
return 0;
}
上面的代码生成以下结果。
OR运算符||
逻辑或运算符||检查两个或多个条件中的任何一个真正。
如果||的任一个或两个操作数 运算符为真,结果为真。
仅当两个操作数都为假时,结果为false。
这里是使用此运算符的示例:
if(a < 10 || b > c || c > 50) {
printf("At least one of the conditions is true.");
}
只有当三个条件a c或c> 50中的至少一个条件为真时,才执行printf()。
您可以使用&& 和|| 逻辑运算符的组合,如下面的代码片段:
if((age > 12 && age < 20) || savings > 5000) {
printf ("hi.");
}
您可以用以下语句替换上一条语句:
bool over_12 = age > 12;
bool undere_20 = age < 20;
bool age_check = over_12 && under_20;
bool savings_check = savings > 50;
if(age_check || savings_check) {
printf ("Hi.");
}
或操作员的真相表
X | y | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
NOT运算符!
逻辑NOT运算符,由!表示。
!! 运算符是一元运算符,因为它只适用于一个操作数。
逻辑NOT运算符反转逻辑表达式的值:true变为false,false变为真。
if( !(age <= 12) )
{
printf("Hi.");
}
非操作者的真值表
X | 结果 |
---|---|
true | false |
false | true |
例子
为了说明如何在C代码中使用逻辑运算符,可以编写此代码。
#include <stdio.h>
// w w w . j a v a 2 s.co m
int main() {
int a,b;
a = 5;
b = 8;
printf("%d \n",a>b && a!=b);
printf("%d \n",!(a>=b));
printf("%d \n",a==b || a>b);
return 0;
}
上面的代码生成以下结果。
实施例2
以下代码显示如何测试字母大小写。
#include <stdio.h>
int main(void)
{// w ww . ja va 2 s. c om
char letter = 0; // Stores an input character
printf("Enter an upper case letter:"); // Prompt for input
scanf(" %c", &letter); // Read the input character
if((letter >= "A") && (letter <= "Z")) // Verify uppercase letter
{
letter += "a"-"A"; // Convert to lowercase
printf("You entered an uppercase %c.\n", letter);
}
else
printf("You did not enter an uppercase letter.\n");
return 0;
}
上面的代码生成以下结果。
实施例3
下面的代码使用ctype.h中的函数:
#include <stdio.h>
#include <ctype.h>
/*w w w . j a v a 2 s . c om*/
int main(void)
{
char letter = 0; // Stores a character
printf("Enter an uppercase letter:"); // Prompt for input
scanf("%c", &letter); // Read a character
if(isalpha(letter) && isupper(letter))
printf("You entered an uppercase %c.\n", tolower(letter));
else
printf("You did not enter an uppercase letter.\n");
return 0;
}
上面的代码生成以下结果。
学习C - C Int类型
带符号的整数类型
我们有五种基本类型的变量来存储有符号整数值,所以为正和负值可以存储。
每种类型由不同的类型指定关键字或关键字组合,如下表所示。
类型名称 | 字节数 |
---|---|
签名字符 | 1 |
short | 2 |
int | 4 |
long | 4 |
长长 | 8 |
下面是这些类型的变量的一些声明:
short shoe_size; int house_number; long long star_count;
类型名称short,long和long long可以写成short int,long int和long long int,并且他们可以选择在前面签名的关键字。
然而,这些类型几乎总是写在他们的缩写形式如上表所示。
类型int也可以写成signed int。
可以存储的值的范围取决于您要使用的特定编译器。
例子
#include <stdio.h>
int main(void)
{ //w ww . ja v a 2 s . c o m
int ten = 10;
int two = 2;
printf("%d minus %d is %d\n", ten, 2, ten - two );
return 0;
}
上面的代码生成以下结果。
无符号整数类型
一些数据总是正的。
对于你不需要的数据以提供负值。
对于每个有符号整数,有一个对应的无符号类型整数,而无符号类型占用与有符号类型相同的内存量。
每个未签名类型名称是带有关键字unsigned的前缀的带符号类型名称。
下表显示了基本设置无符号整数类型。
类型名称 | 字节数 |
---|---|
无符号字符 | 1 |
无符号短整型或无符号短整型 | 2 |
unsigned int | 4 |
unsigned long或unsigned long int | 4 |
unsigned long long或unsigned long long int | 8 |
对于给定数量的比特,可以表示的不同值的数量是固定的。
例如,32位整数变量可以存储4,294,967,296个不同的值。
使用无符号类型不会提供比相应的有符号类型更多的值。
这里是无符号整数变量声明的例子:
unsigned int count; unsigned long population;
以下代码显示如何声明一个unsigned int。
#include <stdio.h>
int main(void)
{
unsigned int iResponse = 0;
printf("%d", iResponse);
return 0;
}
上面的代码生成以下结果。
整数常量
因为你可以有不同类型的整数变量,我们有不同类型的整数常数。
如果你只是写整数值100,例如,这将是int类型。
如果要确保类型为long,则必须附加大写或小写字母L.到数值。
所以100作为长值写为100L。
要声明和初始化变量my_value,您可以这样写:
long my_value = 123456789L;
您使用负号写负整数常量,例如:
int decrease = -4; long my_value = -100000L;
通过追加两个Ls,可以将整数常量指定为long long类型:
long long my_value = 123456789LL;
要将常量指定为无符号类型,请追加U,如下例所示:
unsigned int count = 100U; unsigned long value = 999999999UL;
要存储具有最大幅度的整数,您可以定义如下的变量:
unsigned long long my_value = 9876543212345678ULL;
ULL指定初始值为unsigned long long类型。
十六进制常量
您可以以十六进制形式(以16为基数)写入整数值。
十六进制数字的数字是相当于十进制值0到15,并且它们由0至9和A至F(或a至f)表示。
十六进制数字用前缀0x
或写入0X
。
十六进制常量可以有一个后缀。
以下是十六进制常量的一些示例:
0xFFFF 0x123456EE 0xFABABULL
八进制常数
八进制值是以8为底的数字。
每个八进制数字具有从0到7的值,其对应于二进制中的三个位。
以零开始的整数常数(例如014)将被解释为八进制数。
014是十进制值12的八进制等效值。
以下代码以十进制,八进制和十六进制打印100。
#include <stdio.h>
int main(void)
{ /*from w w w.j a v a 2 s . c o m*/
int x = 100;
printf("dec = %d; octal = %o; hex = %x\n", x, x, x);
printf("dec = %d; octal = %#o; hex = %#x\n", x, x, x);
return 0;
}
上面的代码生成以下结果。
整数溢出
如果一个整数试图对它的类型太大,会发生什么?
让我们设置一个整数到它最大的可能值,添加它。
尝试使用有符号和无符号类型。
printf()函数使用%u说明符显示无符号整型值。
#include <stdio.h>
#define PAGES 959 /*from w ww . jav a 2 s .c om*/
int main(void) {
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d\n", i, i+1, i+2);
printf("%u %u %u\n", j, j+1, j+2);
printf("*%d*\n", PAGES);
printf("*%2d*\n", PAGES);
printf("*%10d*\n", PAGES);
printf("*%-10d*\n", PAGES);
return 0;
}
整数unsigned int变量j,像里程表,从0开始,但int变量i从-2147483648。
上面的代码生成以下结果。
实施例2
下面的代码使用便携式名称作为整数类型。
#include <stdio.h>
#include <inttypes.h> // supports portable types
int main(void)
{ /* w w w .ja v a2s .c o m*/
int32_t me32; // me32 a 32-bit signed variable
me32 = 45933945;
printf("First, assume int32_t is int: ");
printf("me32 = %d\n", me32);
printf("Next, let"s not make any assumptions.\n");
printf("Instead, use a \"macro\" from inttypes.h: ");
printf("me32 = %" PRId32 "\n", me32);
return 0;
}
上面的代码生成以下结果。