百度网站推广网络南阳网站建设哪家专业

当前位置: 首页 > news >正文

百度网站推广网络,南阳网站建设哪家专业,苏州做网站公司精选苏州聚尚网络,asp.net 新建网站C 常量 常量是固定值#xff0c;在程序执行期间不会改变。这些固定的值#xff0c;又叫做字面量。 常量可以是任何的基本数据类型#xff0c;可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量#xff0c;只不过常量的值在定义后不能进行修改。 …C 常量 常量是固定值在程序执行期间不会改变。这些固定的值又叫做字面量。 常量可以是任何的基本数据类型可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量只不过常量的值在定义后不能进行修改。 整数常量 整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数0x 或 0X 表示十六进制0 表示八进制不带前缀则默认表示十进制。 整数常量也可以带一个后缀后缀是 U 和 L 的组合U 表示无符号整数unsignedL 表示长整数long。后缀可以是大写也可以是小写U 和 L 的顺序任意。 下面列举几个整数常量的实例 212 // 合法的 215u // 合法的 0xFeeL // 合法的 078 // 非法的8 不是八进制的数字 032UU // 非法的不能重复后缀以下是各种类型的整数常量的实例 85 // 十进制 0213 // 八进制 0x4b // 十六进制 30 // 整数 30u // 无符号整数 30l // 长整数 30ul // 无符号长整数浮点常量 浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。 当使用小数形式表示时必须包含小数点、指数或同时包含两者。当使用指数形式表示时必须包含整数部分、小数部分或同时包含两者。带符号的指数是用 e 或 E 引入的。 下面列举几个浮点常量的实例 3.14159 // 合法的 314159E-5L // 合法的 510E // 非法的不完整的指数 210f // 非法的没有小数或指数 .e55 // 非法的缺少整数或分数布尔常量 布尔常量共有两个它们都是标准的 C 关键字 true 值代表真。false 值代表假。 我们不应把 true 的值看成 1把 false 的值看成 0。 字符常量 字符常量是括在单引号中。如果常量以 L仅当大写时开头则表示它是一个宽字符常量例如 Lx此时它必须存储在 wchar_t 类型的变量中。否则它就是一个窄字符常量例如 x此时它可以存储在 char 类型的简单变量中。 字符常量可以是一个普通的字符例如 x、一个转义序列例如 \t或一个通用的字符例如 \u02C0。 在 C 中有一些特定的字符当它们前面有反斜杠时它们就具有特殊的含义被用来表示如换行符\n或制表符\t等。下表列出了一些这样的转义序列码 转义序列含义\\ 字符\ 字符\ 字符\?? 字符\a警报铃声\b退格键\f换页符\n换行符\r回车\t水平制表符\v垂直制表符\ooo一到三位的八进制数\xhh …一个或多个数字的十六进制数 下面的实例显示了一些转义序列字符 #include iostream using namespace std;int main() {cout Hello\tWorld\n\n;return 0; } 当上面的代码被编译和执行时它会产生下列结果 Hello World字符串常量 字符串字面值或常量是括在双引号 中的。一个字符串包含类似于字符常量的字符普通的字符、转义序列和通用的字符。 您可以使用空格做分隔符把一个很长的字符串常量进行分行。 下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。 hello, dearhello, \dearhello, d ear 定义常量 在 C 中有两种简单的定义常量的方式 使用 #define 预处理器。使用 const 关键字。 #define 预处理器 下面是使用 #define 预处理器定义常量的形式 #define identifier value具体请看下面的实例 #include iostream using namespace std;#define LENGTH 10
#define WIDTH 5 #define NEWLINE \nint main() {int area; area LENGTH * WIDTH;cout area;cout NEWLINE;return 0; } 尝试一下 当上面的代码被编译和执行时它会产生下列结果 50const 关键字 您可以使用 const 前缀声明指定类型的常量如下所示 const type variable value;具体请看下面的实例 #include iostream using namespace std;int main() {const int LENGTH 10;const int WIDTH 5;const char NEWLINE \n;int area; area LENGTH * WIDTH;cout area;cout NEWLINE;return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 50请注意把常量定义为大写字母形式是一个很好的编程实践。 C 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。修饰符用于改变基本类型的含义所以它更能满足各种情境的需求。 下面列出了数据类型修饰符 signedunsignedlongshort 修饰符 signed、unsigned、long 和 short 可应用于整型signed 和 unsigned 可应用于字符型long 可应用于双精度型。 修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀。例如unsigned long int。 C 允许使用速记符号来声明无符号短整数或无符号长整数。您可以不写 int只写单词 unsigned short 或 unsigned longint 是隐含的。例如下面的两个语句都声明了无符号整型变量。 unsigned x; unsigned int y;为了理解 C 解释有符号整数和无符号整数修饰符之间的差别我们来运行一下下面这个短程序 #include iostream using namespace std;/* * 这个程序演示了有符号整数和无符号整数之间的差别 / int main() {short int i; // 有符号短整数short unsigned int j; // 无符号短整数j 50000;i j;cout i j;return 0; } 当上面的程序运行时会输出下列结果 -15536 50000上述结果中无符号短整数 50,000 的位模式被解释为有符号短整数 -15,536。 C 中的类型限定符 类型限定符提供了变量的额外信息。 限定符含义constconst 类型的对象在程序执行期间不能被修改改变。volatile修饰符 volatile 告诉编译器变量的值可能以程序未明确指定的方式被改变。restrict由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。 C 存储类 存储类定义 C 程序中变量/函数的范围可见性和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类 autoregisterstaticexternmutable auto 存储类 在C11 中 auto 关键字不再是C存储类说明符。从C11开始auto 关键字声明一个变量该变量的类型是从其声明中的初始化表达式推导出来的。 auto 存储类是所有局部变量默认的存储类。 {int mount;auto int month; }上面的实例定义了两个带有相同存储类的变量auto 只能用在函数内即 auto 只能修饰局部变量。 register 存储类 register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小通常是一个词且不能对它应用一元的 运算符因为它没有内存位置。 {register int miles; }寄存器只用于需要快速访问的变量比如计数器。还应注意的是定义 register 并不意味着变量将被存储在寄存器中它意味着变量可能存储在寄存器中这取决于硬件和实现的限制。 static 存储类 static 存储类指示编译器在程序的生命周期内保持局部变量的存在而不需要在每次它进入和离开作用域时进行创建和销毁。因此使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 static 修饰符也可以应用于全局变量。当 static 修饰全局变量时会使变量的作用域限制在声明它的文件内。 在 C 中当 static 用在类数据成员上时会导致仅有一个该成员的副本被类的所有对象共享。 #include iostream// 函数声明 void func(void);static int count 10; / 全局变量 */int main() {while(count–){func();}return 0; } // 函数定义 void func( void ) {static int i 5; // 局部静态变量i;std::cout 变量 i 为 i ;std::cout , 变量 count 为 count std::endl; } 尝试一下 当上面的代码被编译和执行时它会产生下列结果 变量 i 为 6 , 变量 count 为 9 变量 i 为 7 , 变量 count 为 8 变量 i 为 8 , 变量 count 为 7 变量 i 为 9 , 变量 count 为 6 变量 i 为 10 , 变量 count 为 5 变量 i 为 11 , 变量 count 为 4 变量 i 为 12 , 变量 count 为 3 变量 i 为 13 , 变量 count 为 2 变量 i 为 14 , 变量 count 为 1 变量 i 为 15 , 变量 count 为 0 extern 存储类 extern 存储类用于提供一个全局变量的引用全局变量对所有的程序文件都是可见的。当您使用 extern 时对于无法初始化的变量会把变量名指向一个之前定义过的存储位置。 当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解extern 是用来在另一个文件中声明一个全局变量或函数。 extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候如下所示 第一个文件main.cpp #include iostreamint count ; extern void write_extern();int main() {count 5;write_extern(); }第二个文件support.cpp #include iostreamextern int count;void write_extern(void) {std::cout Count is count std::endl; }
在这里第二个文件中的 extern 关键字用于声明已经在第一个文件 main.cpp 中定义的 count。现在 编译这两个文件如下所示 \(g main.cpp support.cpp -o write这会产生 write 可执行程序尝试执行 write它会产生下列结果 \) ./write Count is 5 mutable 存储类 mutable 说明符仅适用于类的对象这将在本教程的最后进行讲解。它允许对象的成员替代常量。也就是说mutable 成员可以通过 const 成员函数修改。 C 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符并提供了以下类型的运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。 算术运算符 下表显示了 C 支持的所有算术运算符。 假设变量 A 的值为 10变量 B 的值为 20则 运算符描述实例把两个操作数相加A B 将得到 30-从第一个操作数中减去第二个操作数A - B 将得到 -10*把两个操作数相乘A * B 将得到 200/分子除以分母B / A 将得到 2%取模运算符整除后的余数B % A 将得到 0自增运算符整数值增加 1A 将得到 11–自减运算符整数值减少 1A– 将得到 9 实例 请看下面的实例了解 C 中所有可用的算术运算符。 复制并黏贴下面的 C 程序到 test.cpp 文件中编译并运行程序。 #include iostream using namespace std;int main() {int a 21;int b 10;int c ;c a b;cout Line 1 - c 的值是 c endl ;c a - b;cout Line 2 - c 的值是 c endl ;c a * b;cout Line 3 - c 的值是 c endl ;c a / b;cout Line 4 - c 的值是 c endl ;c a % b;cout Line 5 - c 的值是 c endl ;c a;cout Line 6 - c 的值是 c endl ;c a–;cout Line 7 - c 的值是 c endl ;return 0; }
当上面的代码被编译和执行时它会产生下列结果 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关系运算符 下表显示了 C 支持的所有关系运算符。 假设变量 A 的值为 10变量 B 的值为 20则 运算符描述实例检查两个操作数的值是否相等如果相等则条件为真。(A B) 不为真。!检查两个操作数的值是否相等如果不相等则条件为真。(A ! B) 为真。检查左操作数的值是否大于右操作数的值如果是则条件为真。(A B) 不为真。检查左操作数的值是否小于右操作数的值如果是则条件为真。(A B) 为真。检查左操作数的值是否大于或等于右操作数的值如果是则条件为真。(A B) 不为真。检查左操作数的值是否小于或等于右操作数的值如果是则条件为真。(A B) 为真。 实例 请看下面的实例了解 C 中所有可用的关系运算符。 复制并黏贴下面的 C 程序到 test.cpp 文件中编译并运行程序。 #include iostream using namespace std;int main() {int a 21;int b 10;int c ;if( a b ){cout Line 1 - a 等于 b endl ;}else{cout Line 1 - a 不等于 b endl ;}if ( a b ) {cout Line 2 - a 小于 b endl ;}else{cout Line 2 - a 不小于 b endl ;}if ( a b ){cout Line 3 - a 大于 b endl ;}else{cout Line 3 - a 不大于 b endl ;} /* 改变 a 和 b 的值 /a 5;b 20;if ( a b ){cout Line 4 - a 小于或等于 b endl ;}if ( b a ){cout Line 5 - b 大于或等于 b endl ;}return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 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 中所有可用的逻辑运算符。 复制并黏贴下面的 C 程序到 test.cpp 文件中编译并运行程序。 #include iostream using namespace std;int main() {int a 5;int b 20;int c ;if ( a b ){cout Line 1 - 条件为真 endl ;}if ( a || b ){cout Line 2 - 条件为真 endl ;} /
改变 a 和 b 的值 */a 0;b 10;if ( a b ){cout Line 3 - 条件为真 endl ;}else{cout Line 4 - 条件不为真 endl ;}if ( !(a b) ){cout Line 5 - 条件为真 endl ;}return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 Line 1 - 条件为真 Line 2 - 条件为真 Line 4 - 条件不为真 Line 5 - 条件为真位运算符 位运算符作用于位并逐位执行操作。、 | 和 ^ 的真值表如下所示 pqp qp | qp ^ q00000010111111010011 假设如果 A 60且 B 13现在以二进制格式表示它们如下所示 A 0011 1100

B 0000 1101

AB 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 00112 的补码形式带符号的二进制数。二进制左移运算符。左操作数的值向左移动右操作数指定的位数。A 2 将得到 240即为 1111 0000二进制右移运算符。左操作数的值向右移动右操作数指定的位数。A 2 将得到 15即为 0000 1111 实例 请看下面的实例了解 C 中所有可用的位运算符。 复制并黏贴下面的 C 程序到 test.cpp 文件中编译并运行程序。 #include iostream using namespace std;int main() {unsigned int a 60; // 60 0011 1100 unsigned int b 13; // 13 0000 1101int c 0; c a b; // 12 0000 1100cout Line 1 - c 的值是 c endl ;c a | b; // 61 0011 1101cout Line 2 - c 的值是 c endl ;c a ^ b; // 49 0011 0001cout Line 3 - c 的值是 c endl ;c ~a; // -61 1100 0011cout Line 4 - c 的值是 c endl ;c a 2; // 240 1111 0000cout Line 5 - c 的值是 c endl ;c a 2; // 15 0000 1111cout Line 6 - c 的值是 c endl ;return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 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 中所有可用的赋值运算符。 复制并黏贴下面的 C 程序到 test.cpp 文件中编译并运行程序。 #include iostream using namespace std;int main() {int a 21;int c ;c a;cout Line 1 - 运算符实例c 的值 : c endl ;c a;cout Line 2 - 运算符实例c 的值 : c endl ;c - a;cout Line 3 - - 运算符实例c 的值 : c endl ;c * a;cout Line 4 - * 运算符实例c 的值 : c endl ;c / a;cout Line 5 - / 运算符实例c 的值 : c endl ;c 200;c % a;cout Line 6 - % 运算符实例c 的值 : c endl ;c 2;cout Line 7 - 运算符实例c 的值 : c endl ;c 2;cout Line 8 - 运算符实例c 的值 : c endl ;c 2;cout Line 9 - 运算符实例c 的值 : c endl ;c ^ 2;cout Line 10 - ^ 运算符实例c 的值 : c endl ;c | 2;cout Line 11 - | 运算符实例c 的值 : c endl ;return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 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杂项运算符 下表列出了 C 支持的其他一些重要的运算符。 运算符描述sizeofsizeof 运算符返回变量的大小。例如sizeof(a) 将返回 4其中 a 是整数。Condition ? X : Y条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。,逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。.点和 -箭头成员运算符用于引用类、结构和共用体的成员。Cast强制转换运算符把一种数据类型转换为另一种数据类型。例如int(2.2000) 将返回 2。指针运算符  返回变量的地址。例如 a; 将给出变量的实际地址。*指针运算符 * 指向一个变量。例如*var; 将指向变量 var。 C 中的运算符优先级 运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级例如乘除运算符具有比加减运算符更高的优先级。 例如 x 7 3 * 2在这里x 被赋值为 13而不是 20因为运算符 * 具有比 更高的优先级所以首先计算乘法 32然后再加上 7。 下表将按运算符优先级从高到低列出各个运算符具有较高优先级的运算符出现在表格的上面具有较低优先级的运算符出现在表格的下面。在表达式中较高优先级的运算符会优先被计算。 类别 运算符 结合性 后缀 () [] - . - -  从左到右 一元  - ! ~ - - (type) sizeof 从右到左 乘除 * / % 从左到右 加减  - 从左到右 移位   从左到右 关系   从左到右 相等  ! 从左到右 位与 AND  从左到右 位异或 XOR ^ 从左到右 位或 OR | 从左到右 逻辑与 AND  从左到右 逻辑或 OR || 从左到右 条件 ?: 从右到左 赋值  - * / % ^ | 从右到左 逗号 , 从左到右  实例 请看下面的实例了解 C 中运算符的优先级。 复制并黏贴下面的 C 程序到 test.cpp 文件中编译并运行程序。 对比有括号和没有括号时的区别这将产生不同的结果。因为 ()、 /、 * 和 有不同的优先级高优先级的操作符将优先计算。 #include iostream using namespace std;int main() {int a 20;int b 10;int c 15;int d 5;int e;e (a b) * c / d; // ( 30 * 15 ) / 5cout (a b) * c / d 的值是 e endl ;e ((a b) * c) / d; // (30 * 15 ) / 5cout ((a b) * c) / d 的值是 e endl ;e (a b) * (c / d); // (30) * (155)cout (a b) * (c / d) 的值是 e endl ;e a (b * c) / d; // 20 (1505)cout a (b * c) / d 的值是 e endl ;return 0; } 尝试一下 当上面的代码被编译和执行时它会产生下列结果 (a b) * c / d 的值是 90 ((a b) * c) / d 的值是 90 (a b) * (c / d) 的值是 90 a (b * c) / d 的值是 50C 循环 有的时候可能需要多次执行同一块代码。一般情况下语句是顺序执行的函数中的第一个语句先执行接着是第二个语句依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次执行一个语句或语句组下面是大多数编程语言中循环语句的一般形式 循环类型 C 编程语言提供了以下几种循环类型。点击链接查看每个类型的细节。 循环类型描述while 循环当给定条件为真时重复语句或语句组。它会在执行循环主体之前测试条件。for 循环多次执行一个语句序列简化管理循环变量的代码。do…while 循环除了它是在循环主体结尾测试条件外其他与 while 语句类似。嵌套循环您可以在 while、for 或 do..while 循环内使用一个或多个循环。 循环控制语句 循环控制语句更改执行的正常序列。当执行离开一个范围时所有在该范围中创建的自动对象都会被销毁。 C 提供了下列的控制语句。点击链接查看每个语句的细节。 控制语句描述break 语句终止 loop 或 switch 语句程序流将继续执行紧接着 loop 或 switch 的下一条语句。continue 语句引起循环跳过主体的剩余部分立即重新开始测试条件。goto 语句将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。 无限循环 如果条件永远不为假则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的您可以将某些条件表达式留空来构成一个无限循环。 #include iostream using namespace std;int main () {for( ; ; ){printf(This loop will run forever.\n);}return 0; }当条件表达式不存在时它被假设为真。您也可以设置一个初始值和增量表达式但是一般情况下C 程序员偏向于使用 for(;;) 结构来表示一个无限循环。 注意您可以按 Ctrl C 键终止一个无限循环。 C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件以及条件为真时要执行的语句必需的和条件为假时要执行的语句可选的。 下面是大多数编程语言中典型的判断结构的一般形式 判断语句 C 编程语言提供了以下类型的判断语句。点击链接查看每个语句的细节。 语句描述if 语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if…else 语句一个 if 语句 后可跟一个可选的 else 语句else 语句在布尔表达式为假时执行。嵌套 if 语句您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。switch 语句一个 switch 语句允许测试一个变量等于多个值时的情况。嵌套 switch 语句您可以在一个 switch 语句内使用另一个 switch 语句。 ? : 运算符 我们已经在前面的章节中讲解了 条件运算符 ? :可以用来替代 if…else 语句。它的一般形式如下 Exp1 ? Exp2 : Exp3;其中Exp1、Exp2 和 Exp3 是表达式。请注意冒号的使用和位置。 ? 表达式的值是由 Exp1 决定的。如果 Exp1 为真则计算 Exp2 的值结果即为整个 ? 表达式的值。如果 Exp1 为假则计算 Exp3 的值结果即为整个 ? 表达式的值。 C 函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数即主函数 main() 所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的但在逻辑上划分通常是根据每个函数执行一个特定的任务来进行的。 函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。 C 标准库提供了大量的程序可以调用的内置函数。例如函数 strcat() 用来连接两个字符串函数 memcpy() 用来复制内存到另一个位置。 函数还有很多叫法比如方法、子例程或程序等等。 定义函数 C 中的函数定义的一般形式如下 return_type function_name( parameter list ) {body of the function }在 C 中函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分 返回类型一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值在这种情况下return_type 是关键字 void。函数名称这是函数的实际名称。函数名和参数列表一起构成了函数签名。参数参数就像是占位符。当函数被调用时您向参数传递一个值这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的也就是说函数可能不包含参数。函数主体函数主体包含一组定义函数执行任务的语句。 实例 以下是 max() 函数的源代码。该函数有两个参数 num1 和 num2会返回这两个数中较大的那个数 // 函数返回两个数中较大的那个数 int max(int num1, int num2) {// 局部变量声明int result;if (num1 num2)result num1;elseresult num2;return result; }尝试一下 函数声明 函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。 函数声明包括以下几个部分 return_type function_name( parameter list );针对上面定义的函数 max()以下是函数声明 int max(int num1, int num2);在函数声明中参数的名称并不重要只有参数的类型是必需的因此下面也是有效的声明 int max(int, int);当您在一个源文件中定义函数且在另一个文件中调用函数时函数声明是必需的。在这种情况下您应该在调用函数的文件顶部声明函数。 调用函数 创建 C 函数时会定义函数做什么然后通过调用函数来完成已定义的任务。 当程序调用函数时程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务当函数的返回语句被执行时或到达函数的结束括号时会把程序控制权交还给主程序。 调用函数时传递所需参数如果函数返回一个值则可以存储返回值。例如 #include iostream using namespace std;// 函数声明 int max(int num1, int num2);int main () {// 局部变量声明int a 100;int b 200;int ret;// 调用函数来获取最大值ret max(a, b);cout Max value is : ret endl;return 0; } // 函数返回两个数中较大的那个数 int max(int num1, int num2){// 局部变量声明int result;if (num1 num2)result num1;elseresult num2;return result; }尝试一下 把 max() 函数和 main() 函数放一块编译源代码。当运行最后的可执行文件时会产生下列结果 Max value is : 200函数参数 如果函数要使用参数则必须声明接受参数值的变量。这些变量称为函数的形式参数。 形式参数就像函数内的其他局部变量在进入函数时被创建退出函数时被销毁。 当调用函数时有两种向函数传递参数的方式 调用类型描述传值调用该方法把参数的实际值复制给函数的形式参数。在这种情况下修改函数内的形式参数对实际参数没有影响。指针调用该方法把参数的地址复制给形式参数。在函数内该地址用于访问调用中要用到的实际参数。这意味着修改形式参数会影响实际参数。引用调用该方法把参数的引用复制给形式参数。在函数内该引用用于访问调用中要用到的实际参数。这意味着修改形式参数会影响实际参数。 默认情况下C 使用传值调用来传递参数。一般来说这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例调用 max() 函数时使用了相同的方法。 参数的默认值 当您定义一个函数您可以为参数列表中后边的每一个参数指定默认值。当调用函数时如果实际参数的值留空则使用这个默认值。 这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时如果未传递参数的值则会使用默认值如果指定了值则会忽略默认值使用传递的值。请看下面的实例 #include iostream using namespace std;int sum(int a, int b20){int result;result a b;return (result); }int main (){// 局部变量声明int a 100;int b 200;int result;// 调用函数来添加值result sum(a, b);cout Total value is : result endl; // 再次调用函数result sum(a); cout Total value is : result endl;return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 Total value is :300 Total value is :120C 数字 通常当我们需要用到数字时我们会使用原始的数据类型如 int、short、long、float 和 double 等等。这些用于数字的数据类型其可能的值和数值范围我们已经在 C 数据类型一章中讨论过。 C 定义数字 我们已经在之前章节的各种实例中定义过数字。下面是一个 C 中定义各种类型数字的综合实例 #include iostream using namespace std;int main () {// 数字定义short s;int i;long l;float f;double d;// 数字赋值s 10; i 1000; l 1000000; f 230.47; d 30949.374;// 数字输出cout short s : s endl;cout int i : i endl;cout long l : l endl;cout float f : f endl;cout double d : d endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 short s :10 int i :1000 long l :1000000 float f :230.47 double d :30949.4C 数学运算 在 C 中除了可以创建各种函数还包含了各种有用的函数供您使用。这些函数写在标准 C 和 C 库中叫做内置函数。您可以在程序中引用这些函数。 C 内置了丰富的数学函数可对各种数字进行运算。下表列出了 C 中一些有用的内置的数学函数。 为了利用这些函数您需要引用数学头文件 cmath。 序号函数 描述1double cos(double); 该函数返回弧度角double 型的余弦。2double sin(double); 该函数返回弧度角double 型的正弦。3double tan(double); 该函数返回弧度角double 型的正切。4double log(double); 该函数返回参数的自然对数。5double pow(double, double); 假设第一个参数为 x第二个参数为 y则该函数返回 x 的 y 次方。6double hypot(double, double); 该函数返回两个参数的平方总和的平方根也就是说参数为一个直角三角形的两个直角边函数会返回斜边的长度。7double sqrt(double); 该函数返回参数的平方根。8int abs(int); 该函数返回整数的绝对值。9double fabs(double); 该函数返回任意一个十进制数的绝对值。10double floor(double); 该函数返回一个小于或等于传入参数的最大整数。 下面是一个关于数学运算的简单实例 #include iostream #include cmath using namespace std;int main () {// 数字定义short s 10;int i -1000;long l 100000;float f 230.47;double d 200.374;// 数学运算cout sin(d) : sin(d) endl;cout abs(i) : abs(i) endl;cout floor(d) : floor(d) endl;cout sqrt(f) : sqrt(f) endl;cout pow( d, 2) : pow(d, 2) endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 sign(d) :-0.634939 abs(i) :1000 floor(d) :200 sqrt(f) :15.1812 pow( d, 2 ) :40149.7C 随机数 在许多情况下需要生成随机数。关于随机数生成器有两个相关的函数。一个是 rand()该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。 下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数通过调用 rand() 函数来生成随机数 #include iostream #include ctime #include cstdlibusing namespace std;int main () {int i,j;// 设置种子srand( (unsigned)time( NULL ) );/* 生成 10 个随机数 */for( i 0; i 10; i ){// 生成实际的随机数j rand();cout 随机数 j endl;}return 0; }
尝试一下 当上面的代码被编译和执行时它会产生下列结果 随机数 1748144778 随机数 630873888 随机数 2134540646 随机数 219404170 随机数 902129458 随机数 920445370 随机数 1319072661 随机数 257938873 随机数 1256201101 随机数 580322989C 数组 C 支持数组数据结构它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量比如 number0、number1、…、number99而是声明一个数组变量比如 numbers然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。 所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素最高的地址对应最后一个元素。 声明数组 在 C 中要声明一个数组需要指定元素的类型和元素的数量如下所示 type arrayName [ arraySize ];这叫做一维数组。arraySize 必须是一个大于零的整数常量type 可以是任意有效的 C 数据类型。例如要声明一个类型为 double 的包含 10 个元素的数组 balance声明语句如下 double balance[10];现在 balance 是一个可用的数组可以容纳 10 个类型为 double 的数字。 初始化数组 在 C 中您可以逐个初始化数组也可以使用一个初始化语句如下所示 double balance[5] {1000.0, 2.0, 3.4, 17.0, 50.0};大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。 如果您省略掉了数组的大小数组的大小则为初始化时元素的个数。因此如果 double balance[] {1000.0, 2.0, 3.4, 17.0, 50.0};您将创建一个数组它与前一个实例中所创建的数组是完全相同的。下面是一个为数组中某个元素赋值的实例 balance[4] 50.0;上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引也被称为基索引数组的最后一个索引是数组的总大小减去 1。以下是上面所讨论的数组的的图形表示 访问数组元素 数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内跟在数组名称的后边。例如 double salary balance[9];上面的语句将把数组中第 10 个元素的值赋给 salary 变量。下面的实例使用了上述的三个概念即声明数组、数组赋值、访问数组 #include iostream using namespace std;#include iomanip using std::setw;int main (){int n[ 10 ]; // n 是一个包含 10 个整数的数组// 初始化数组元素 for ( int i 0; i 10; i ){n[ i ] i 100; // 设置元素 i 为 i 100}cout Element setw( 13 ) Value endl;// 输出数组中每个元素的值 for ( int j 0; j 10; j ){cout setw( 7 ) j setw( 13 ) n[ j ] endl;}return 0; } 上面的程序使用了 setw() 函数来格式化输出。当上面的代码被编译和执行时它会产生下列结果 Element Value0 1001 1012 1023 1034 1045 1056 1067 1078 1089 109C 中数组详解 在 C 中数组是非常重要的我们需要了解更多有关数组的细节。下面列出了 C 程序员必须清楚的一些与数组相关的重要概念 概念描述多维数组C 支持多维数组。多维数组最简单的形式是二维数组。指向数组的指针您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。传递数组给函数您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。从函数返回数组C 允许从函数返回数组。 C 字符串 C 字符串 C 提供了以下两种类型的字符串表示形式 C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言并在 C 中继续得到支持。字符串实际上是使用 null 字符 终止的一维字符数组。因此一个以 null 结尾的字符串包含了组成字符串的字符。 下面的声明和初始化创建了一个 Hello 字符串。由于在数组的末尾存储了空字符所以字符数组的大小比单词 Hello 的字符数多一个。char greeting[6] {H, e, l, l, o, }; 依据数组初始化规则您可以把上面的语句写成以下语句 char greeting[] Hello; 以下是 C/C 中定义的字符串的内存表示 其实您不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时自动把 放在字符串的末尾。让我们尝试输出上面的字符串 #include iostreamusing namespace std;int main () {char greeting[6] {H, e, l, l, o, \0};cout Greeting message: ;cout greeting endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 Greeting message: Hello C 中有大量的函数用来操作以 null 结尾的字符串supports a wide range of functions that manipulate null-terminated strings: 序号函数 目的1strcpy(s1, s2); 复制字符串 s2 到字符串 s1。2strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。3strlen(s1); 返回字符串 s1 的长度。4strcmp(s1, s2); 如果 s1 和 s2 是相同的则返回 0如果 s1s2 则返回小于 0如果 s1s2 则返回大于 0。5strchr(s1, ch); 返回一个指针指向字符串 s1 中字符 ch 的第一次出现的位置。6strstr(s1, s2); 返回一个指针指向字符串 s1 中字符串 s2 的第一次出现的位置。 下面的实例使用了上述的一些函数 #include iostream #include cstringusing namespace std;int main () {char str1[11] Hello;char str2[11] World;char str3[11];int len ;// 复制 str1 到 str3strcpy( str3, str1);cout strcpy( str3, str1) : str3 endl;// 连接 str1 和 str2strcat( str1, str2);cout strcat( str1, str2): str1 endl;// 连接后str1 的总长度len strlen(str1);cout strlen(str1) : len endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 strcpy( str3, str1) : Hello strcat( str1, str2): HelloWorld strlen(str1) : 10 C 中的 String 类 C 标准库提供了 string 类类型支持上述所有的操作另外还增加了其他更多的功能。我们将学习 C 标准库中的这个类现在让我们先来看看下面这个实例 现在您可能还无法透彻地理解这个实例因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看下这个实例等理解了面向对象的概念之后再回头来理解这个实例。 #include iostream #include stringusing namespace std;int main () {string str1 Hello;string str2 World;string str3;int len ;// 复制 str1 到 str3str3 str1;cout str3 : str3 endl; // 连接 str1 和 str2str3 str1 str2;cout str1 str2 : str3 endl;// 连接后str3 的总长度len str3.size();cout str3.size() : len endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 str3 : Hello str1 str2 : HelloWorld str3.size() : 10 C 指针 C 指针 学习 C 的指针既简单又有趣。通过指针可以简化一些 C 编程任务的执行还有一些任务如动态内存分配没有指针是无法执行的。所以想要成为一名优秀的 C 程序员学习指针是很有必要的。 正如您所知道的每一个变量都有一个内存位置每一个内存位置都定义了可使用连字号运算符访问的地址它表示了在内存中的一个地址。请看下面的实例它将输出定义的变量地址 #include iostreamusing namespace std;int main (){int var1;char var2[10];cout var1 变量的地址 ;cout var1 endl;cout var2 变量的地址 ;cout var2 endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 var1 变量的地址 0xbfebd5c0 var2 变量的地址 0xbfebd5b6通过上面的实例我们了解了什么是内存地址以及如何访问它。接下来让我们看看什么是指针。 什么是指针 指针是一个变量其值为另一个变量的地址即内存位置的直接地址。就像其他变量或常量一样您必须在使用指针存储其他变量地址之前对其进行声明。指针变量声明的一般形式为 type *var-name;在这里type 是指针的基类型它必须是一个有效的 C 数据类型var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是在这个语句中星号是用来指定一个变量是指针。以下是有效的指针声明 int ip; / 一个整型的指针 */ double dp; / 一个 double 型的指针 */ float fp; / 一个浮点型的指针 */ char ch; / 一个字符型的指针 */所有指针的值的实际数据类型不管是整型、浮点型、字符型还是其他的数据类型都是一样的都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是指针所指向的变量或常量的数据类型不同。 C 中使用指针 使用指针时会频繁进行以下几个操作定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作 #include iostreamusing namespace std;int main () {int var 20; // 实际变量的声明int *ip; // 指针变量的声明ip var; // 在指针变量中存储 var 的地址cout Value of var variable: ;cout var endl;// 输出在指针变量中存储的地址cout Address stored in ip variable: ;cout ip endl;// 访问指针中地址的值cout Value of *ip variable: ;cout *ip endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 Value of var variable: 20 Address stored in ip variable: 0xbfc601ac Value of *ip variable: 20C 指针详解 在 C 中有很多指针相关的概念这些概念都很简单但是都很重要。下面列出了 C 程序员必须清楚的一些与指针相关的重要概念 概念描述C Null 指针C 支持空指针。NULL 指针是一个定义在标准库中的值为零的常量。C 指针的算术运算可以对指针进行四种算术运算、–、、-C 指针 vs 数组指针和数组之间有着密切的关系。C 指针数组可以定义用来存储指针的数组。C 指向指针的指针C 允许指向指针的指针。C 传递指针给函数通过引用或地址传递参数使传递的参数在调用函数中被改变。C 从函数返回指针C 允许函数返回指针到局部变量、静态变量和动态内存分配。 C 引用 C 引用 引用变量是一个别名也就是说它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量就可以使用该引用名称或变量名称来指向变量。 C 引用 vs 指针 引用很容易与指针混淆它们之间有三个主要的不同 不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。 C 中创建引用 试想变量名称是变量附属在内存位置中的标签您可以把引用当成是变量附属在内存位置中的第二个标签。因此您可以通过原始变量名称或引用来访问变量的内容。例如 int i 17; double d 23.5; 我们可以为 i 和d声明引用变量如下所示 int r i; double s d; 在这些声明中 读作引用。因此第一个声明可以读作 r 是一个初始化为 i 的整型引用第二个声明可以读作 s 是一个初始化为 d 的 double 型引用。下面的实例使用了 int 和 double 引用 #include iostreamusing namespace std;int main (){// 声明简单的变量int i;double d; // 声明引用变量int r i;double s d;i 5;cout Value of i : i endl;cout Value of i reference : r endl;d 11.7;cout Value of d : d endl;cout Value of d reference : s endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 Value of i : 5 Value of i reference : 5 Value of d : 11.7 Value of d reference : 11.7引用通常用于函数参数列表和函数返回值。下面列出了 C 程序员必须清楚的两个与 C 引用相关的重要概念 概念描述把引用作为参数C 支持把引用作为参数传给函数这比传一般的参数更安全。把引用作为返回值可以从 C 函数中返回引用就像返回其他数据类型一样。 C 日期 时间 C 日期 时间 C 标准库没有提供所谓的日期类型。C 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构需要在 C 程序中引用 ctime 头文件。 有四个与时间相关的类型clock_t、time_t、size_t 和 tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。 结构类型 tm 把日期和时间以 C 结构的形式保存tm 结构的定义如下 struct tm {int tm_sec; // 秒正常范围从 0 到 59但允许至 61int tm_min; // 分范围从 0 到 59int tm_hour; // 小时范围从 0 到 23int tm_mday; // 一月中的第几天范围从 1 到 31int tm_mon; // 月范围从 0 到 11int tm_year; // 自 1900 年起的年数int tm_wday; // 一周中的第几天范围从 0 到 6从星期日算起int tm_yday; // 一年中的第几天范围从 0 到 365从 1 月 1 日算起int tm_isdst; // 夏令时 }下面是 C/C 中关于日期和时间的重要函数。所有这些函数都是 C/C 标准库的组成部分您可以在 C 标准库中查看一下各个函数的细节。 序号函数 描述1time_t time(time_t *time); 该函数返回系统的当前日历时间自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间则返回 .1。2char *ctime(const time_t *time); 该返回一个表示当地时间的字符串指针字符串形式 day month year hours:minutes:seconds year\n。3struct tm *localtime(const time_t *time); 该函数返回一个指向表示本地时间的 tm 结构的指针。4clock_t clock(void); 该函数返回程序执行起一般为程序的开头处理器时钟所使用的时间。如果时间不可用则返回 .1。5char * asctime ( const struct tm * time ); 该函数返回一个指向字符串的指针字符串包含了 time 所指向结构中存储的信息返回形式为day month date hours:minutes:seconds year\n\0。6struct tm *gmtime(const time_t *time); 该函数返回一个指向 time 的指针time 为 tm 结构用协调世界时UTC也被称为格林尼治标准时间GMT表示。7time_t mktime(struct tm time); 该函数返回日历时间相当于 time 所指向结构中存储的时间。8double difftime ( time_t time2, time_t time1 ); 该函数返回 time1 和 time2 之间相差的秒数。9size_t strftime(); 该函数可用于格式化日期和时间为指定的格式。 当前日期和时间 下面的实例获取当前系统的日期和时间包括本地时间和协调世界时UTC。 #include iostream #include ctimeusing namespace std;int main( ) {// 基于当前系统的当前日期/时间time_t now time(0);// 把 now 转换为字符串形式char dt ctime(now);cout 本地日期和时间 dt endl;// 把 now 转换为 tm 结构tm *gmtm gmtime(now);dt asctime(gmtm);cout UTC 日期和时间 dt endl; } 当上面的代码被编译和执行时它会产生下列结果 本地日期和时间Sat Jan 8 20:07:41 2011UTC 日期和时间Sun Jan 9 03:07:41 2011使用结构 tm 格式化时间 tm 结构在 C/C 中处理日期和时间相关的操作时显得尤为重要。tm 结构以 C 结构的形式保存日期和时间。大多数与时间相关的函数都使用了 tm 结构。下面的实例使用了 tm 结构和各种与日期和时间相关的函数。 在练习使用结构之前需要对 C 结构有基本的了解并懂得如何使用箭头 - 运算符来访问结构成员。 #include iostream #include ctimeusing namespace std;int main(){// 基于当前系统的当前日期/时间time_t now time(0);cout 1970年1月1日到目前经过的秒数: now endl;tm *ltm localtime(now);// 输出 tm 结构的各个组成部分cout 年: 1900 ltm-tm_year endl;cout 月: 1 ltm-tm_mon endl;cout 日: ltm-tm_mday endl;cout 时间: 1 ltm-tm_hour :;cout 1 ltm-tm_min :;cout 1 ltm-tm_sec endl; }
当上面的代码被编译和执行时它会产生下列结果 1970年1月1日到目前经过的秒数:1524456057 年: 2018 月: 4 日: 23 时间: 5:1:58C 基本的输入输出 C 基本的输入输出 C 标准库提供了一组丰富的输入/输出功能我们将在后续的章节进行介绍。本章将讨论 C 编程中最基本和最常见的 I/O 操作。 C 的 I/O 发生在流中流是字节序列。如果字节流是从设备如键盘、磁盘驱动器、网络连接等流向内存这叫做输入操作。如果字节流是从内存流向设备如显示屏、打印机、磁盘驱动器、网络连接等这叫做输出操作。 I/O 库头文件 下列的头文件在 C 编程中很重要。 头文件函数和描述iostream该文件定义了 cin、cout、cerr 和 clog 对象分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。iomanip该文件通过所谓的参数化的流操纵器比如 setw 和 setprecision来声明对执行标准化 I/O 有用的服务。fstream该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节。 标准输出流cout 预定义的对象 cout 是 ostream 类的一个实例。cout 对象连接到标准输出设备通常是显示屏。cout 是与流插入运算符 结合使用的如下所示 #include iostream using namespace std;int main( ){char str[] Hello C;cout Value of str is : str endl; }
当上面的代码被编译和执行时它会产生下列结果 Value of str is : Hello CC 编译器根据要输出变量的数据类型选择合适的流插入运算符来显示值。 运算符被重载来输出内置类型整型、浮点型、double 型、字符串和指针的数据项。 流插入运算符 在一个语句中可以多次使用如上面实例中所示endl 用于在行末添加一个换行符。 标准输入流cin 预定义的对象 cin 是 istream 类的一个实例。cin 对象附属到标准输入设备通常是键盘。cin 是与流提取运算符 结合使用的如下所示 #include iostream using namespace std;int main(){char name[50];cout 请输入您的名称 ;cin name;cout 您的名称是 name endl;
}
当上面的代码被编译和执行时它会提示用户输入名称。当用户输入一个值并按回车键就会看到下列结果 请输入您的名称 cplusplus 您的名称是 cplusplusC 编译器根据要输入值的数据类型选择合适的流提取运算符来提取值并把它存储在给定的变量中。 流提取运算符 在一个语句中可以多次使用如果要求输入多个数据可以使用如下语句 cin name age;这相当于下面两个语句 cin name; cin age;标准错误流cerr 预定义的对象 cerr 是 ostream 类的一个实例。cerr 对象附属到标准错误设备通常也是显示屏但是 cerr 对象是非缓冲的且每个流插入到 cerr 都会立即输出。 cerr 也是与流插入运算符 结合使用的如下所示 #include iostream using namespace std;int main(){char str[] Unable to read….;cerr Error message : str endl; }
当上面的代码被编译和执行时它会产生下列结果 Error message : Unable to read….标准日志流clog 预定义的对象 clog 是 ostream 类的一个实例。clog 对象附属到标准错误设备通常也是显示屏但是 clog 对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区中直到缓冲填满或者缓冲区刷新时才会输出。 clog 也是与流插入运算符 结合使用的如下所示 #include iostream using namespace std;int main(){char str[] Unable to read….;clog Error message : str endl; }
当上面的代码被编译和执行时它会产生下列结果 Error message : Unable to read….通过这些小实例我们无法区分 cout、cerr 和 clog 的差异但在编写和执行大型程序时它们之间的差异就变得非常明显。所以良好的编程实践告诉我们使用 cerr 流来显示错误消息而其他的日志消息则使用 clog 流来输出。 C 数据结构 C 数据结构 C/C 数组允许定义可存储相同类型数据项的变量但是结构是 C 中另一种用户自定义的可用的数据类型它允许您存储不同类型的数据项。 结构用于表示一条记录假设您想要跟踪图书馆中书本的动态您可能需要跟踪每本书的下列属性 TitleAuthorSubjectBook ID 定义结构 为了定义结构您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型struct 语句的格式如下 struct [structure tag]{member definition;member definition;…member definition; }[one or more structure variables];
structure tag 是可选的每个 member definition 是标准的变量定义比如 int i; 或者 float f; 或者其他有效的变量定义。在结构定义的末尾最后一个分号之前您可以指定一个或多个结构变量这是可选的。下面是声明 Book 结构的方式 struct Books{char title[50];char author[50];char subject[100];int book_id; }book;
访问结构成员 为了访问结构的成员我们使用成员访问运算符.。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 struct 关键字来定义结构类型的变量。下面的实例演示了结构的用法 #include iostream #include cstringusing namespace std;struct Books{char title[50];char author[50];char subject[100];int book_id; };int main(){struct Books Book1; // 声明 Book1类型为 Bookstruct Books Book2; // 声明 Book2类型为 Book// Book1 详述strcpy( Book1.title, Learn C Programming);strcpy( Book1.author, Chand Miyan); strcpy( Book1.subject, C Programming);Book1.book_id 6495407;// Book2 详述strcpy( Book2.title, Telecom Billing);strcpy( Book2.author, Yakit Singha);strcpy( Book2.subject, Telecom);Book2.book_id 6495700;// 输出 Book1 信息cout Book 1 title : Book1.title endl;cout Book 1 author : Book1.author endl;cout Book 1 subject : Book1.subject endl;cout Book 1 id : Book1.book_id endl;// 输出 Book2 信息cout Book 2 title : Book2.title endl;cout Book 2 author : Book2.author endl;cout Book 2 subject : Book2.subject endl;cout Book 2 id : Book2.book_id endl;return 0; } 当上面的代码被编译和执行时它会产生下列结果 Book 1 title : Learn C Programming Book 1 author : Chand Miyan Book 1 subject : C Programming Book 1 id : 6495407 Book 2 title : Telecom Billing Book 2 author : Yakit Singha Book 2 subject : Telecom Book 2 id : 6495700结构作为函数参数 您可以把结构作为函数参数传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量 #include iostream #include cstringusing namespace std; void printBook( struct Books book );struct Books{char title[50];char author[50];char subject[100];int book_id; };int main(){struct Books Book1; // 声明 Book1类型为 Bookstruct Books Book2; // 声明 Book2类型为 Book// Book1 详述strcpy( Book1.title, Learn C Programming);strcpy( Book1.author, Chand Miyan); strcpy( Book1.subject, C Programming);Book1.book_id 6495407;// Book2 详述strcpy( Book2.title, Telecom Billing);strcpy( Book2.author, Yakit Singha);strcpy( Book2.subject, Telecom);Book2.book_id 6495700;// 输出 Book1 信息printBook( Book1 );// 输出 Book2 信息printBook( Book2 );return 0; } void printBook( struct Books book ){cout Book title : book.title endl;cout Book author : book.author endl;cout Book subject : book.subject endl;cout Book id : book.book_id endl; } 当上面的代码被编译和执行时它会产生下列结果 Book title : Learn C Programming Book author : Chand Miyan Book subject : C Programming Book id : 6495407 Book title : Telecom Billing Book author : Yakit Singha Book subject : Telecom Book id : 6495700指向结构的指针 您可以定义指向结构的指针方式与定义指向其他类型变量的指针相似如下所示 struct Books *struct_pointer;现在您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址请把 运算符放在结构名称的前面如下所示 struct_pointer Book1;为了使用指向该结构的指针访问结构的成员您必须使用 - 运算符如下所示 struct_pointer-title; 让我们使用结构指针来重写上面的实例这将有助于您理解结构指针的概念 #include iostream #include cstringusing namespace std; void printBook( struct Books *book );struct Books {char title[50];char author[50];char subject[100];int book_id; };int main( ) {struct Books Book1; // 声明 Book1类型为 Bookstruct Books Book2; // 声明 Book2类型为 Book */// Book1 详述strcpy( Book1.title, Learn C Programming);strcpy( Book1.author, Chand Miyan); strcpy( Book1.subject, C Programming);Book1.book_id 6495407;// Book2 详述strcpy( Book2.title, Telecom Billing);strcpy( Book2.author, Yakit Singha);strcpy( Book2.subject, Telecom);Book2.book_id 6495700;// 通过传 Book1 的地址来输出 Book1 信息printBook( Book1 );// 通过传 Book2 的地址来输出 Book2 信息printBook( Book2 );return 0; } // 该函数以结构指针作为参数 void printBook( struct Books *book ) {cout Book title : book-title endl;cout Book author : book-author endl;cout Book subject : book-subject endl;cout Book id : book-book_id endl; }
当上面的代码被编译和执行时它会产生下列结果 Book title : Learn C Programming Book author : Chand Miyan Book subject : C Programming Book id : 6495407 Book title : Telecom Billing Book author : Yakit Singha Book subject : Telecom Book id : 6495700typedef 关键字 下面是一种更简单的定义结构的方式您可以为创建的类型取一个别名。例如 typedef struct {char title[50];char author[50];char subject[100];int book_id; }Books; 现在您可以直接使用 Books 来定义 Books 类型的变量而不需要使用 struct 关键字。下面是实例 Books Book1, Book2;您可以使用 typedef 关键字来定义非结构类型如下所示 typedef long int *pint32;pint32 x, y, z;x, y 和 z 都是指向长整型 long int 的指针。