关于C++的一些细节[四:循环,分支语句,关系表达式,关系运算符]

类别:编程语言 点击:0 评论:0 推荐:

5.循环和关系表达式

5.1 C++语法将整个for循环看作一条语句.

5.2 循环只执行一次初始化.

5.3 执行测试条件: 可以是任意表达式.

C++将把运算结果转换为bool类型: 非零转换为true, 0转换为false.  这种变化不会导致不兼容问题--因为C++会在需要整数值的地方将true/flase 分别转换为1/0; 在需要 bool值的地方 将0 转换为false,非零转换为true.

5.4 for循环是入口条件循环--进入每轮循环前都会计算测试表达式的值.

5.5 编码习惯: for 和 '(' 之间加一空格;而函数名与括号之间不加空格.   从视觉上强化控制语句和函数调用 之间的区别.

5.6 表达式:   C++表达式是值或与操作符的组合,每个C++表达式都有值.

      eg: a = 3 表达式的值为 3;   因而 允许 这样: a = b =c =0; //从右向左: c = 0的值为0,所以变成: a = b = 0;......

      x<y 表达式的值为: true or false.  cout<<x<y; 将显示 1 or 0.

      可以使用 cout.setf(ios_base::boolalpha);//旧版用:ios::boolalpha 设置一标记, cout 将显示 true or false.

      表达式加上分号 ';' 都成语句,   eg: a+b; 为合法语句,只是没用得到的结果.

      语句去掉分号不一定为表达式,  eg: int a; 为语句, 去掉分号则不是表达式.

5.7 可以在for循环初始化部分声明变量. 为局部变量,离开循环后变量将消失.

5.8 建议: 在声明数组和引用数组长度时(如:for循环)使用const值, 以避免值被修改.

5.9 省略for循环中测试表达式,将认为是 true. 如: for(;;){} 测试表达是为true 程序不会终止.

5.10 语句块 { } . 代码中可以用一对花括号 {} 将一段代码括起. 在里面声明的变量的作用范围只是其所在语句块.

5.11 逗好操作符 可以将多个表达式用 ',' 分割放在一个for循环表达式中

      i = 20, j = 2 * i  //逗好操作符 确保先计算第一个表达式,以后逐个计算; 而整体表达式的值为最后一个表达式的值.          还有 (17,40) 表达式的值为 40.

5.12 花絮:

      ** for (cin>>x; x == 0; cin>>x){}  //接受输入,直到输入的是 数值: 0.

      *** 上式中 '==' 若误写为 '=' 关系运算 将变为 赋值运算. 如运算符 右边的值非零,则测试表达式的值为true,循环将不会终止.

5.13  while 循环

*** delay 一例:

      #include<ctime> describes clock() function, clock_t type

      clock_t delay = secs * CLOCKS_PER_SEC;   //defined in ctime

      clock_t start = clock(); //get system clock.

      while (clock() - start < delay); // waiting for secs seconds.

***类型别名: clock_t 作为clock()返回类型的别名,编译器将把它转换为long,ynsigned int 或适合系统的其它类型.

建立方式:

      i: 使用预处理器.   #define clock_t unsigned int

      ii: 用关键字typedef 创建别名: 将别名声明成为所需的类型,然后在前面加 typedef.

      区别: typedef不会创建新类型,只为已有的类型建一新名称.  预处理则 使用替换的方法,有如下的缺点:

 eg: #define F_P float *

       F_P pa,pb;

编译器将其替换为:  float * pa,pb; //pb不是如你所愿地声明为 float* ,而只是 float类型.

5.14 do while 循环, 为出口条件循环.

5.15 文本输入.

    *** cin . 发送给cin 的输入被缓冲,只有按回车键后,它的输入的内容才被发送给程序.  而且cin 将忽略空白符.

    *** cin.get(ch)  输入仍被缓冲,不过接收每个字符.输入的字符将被赋值给ch.   ch必须为char类型,不能为int

    cin.get(ch) 参数为引用: char & ,所以可以修改 ch, 否则参数需传入 &ch.

   #*# cin.get(ch) 用于字符输入时返回 istream类对象,并转换为bool类型 true;  到达文件尾时,函数返回istream类对象,并转换为bool类型 false.

   #*# int ch = cin.get() 用于字符输入时返回 int类型的字符编码; 达到文件尾时函数返回 EOF, 多数系统中被定义为 '-1'.

   eg:  while ((ch = cin.get()) != EOF){}            whie (cin.get(ch)){}

   cin.put(ch); //ch若为 int类型 需要转换为char 类型.

6. 分支语句和逻辑操作符

6.1 花絮

      * if (3 == num)...   // 如果错写为 3=num, 编译器会报错, 有些聪明的编译器会识别 if (num=3) 的错误.

      * (17 < age <3 9) 等价于 ((17 < age) < 39)

      * bool a,b;    a && b, 若 a 为false, 则表达式 a && b 将不判断 b的值.

      * and, or, not 在c++中为保留字;  但在C 语言中非保留字, 要使用 需加头文件: <iso646.h>

6.2 cctype 字符函数库  对所有字符编码通用.

  有函数: isalpha9char) 非char返回0.                   ispunct(char)  输入为标点符号 返回true.

                isspace(), isdigits() ......

6.3  switch 语句 标签都是整数常量表达式.

6.4 数字输入.

   eg:  int apple[10];           char ch;

   while (ch !='Q' && cin>>apple[i])    //cin>>apple[i] 若输入非数字,则返回istream类对象,并转换为bool型 false.

while (!(cin>>apple[i]))

{

     cin.clear();  // 如果输入非数字,cin返回 false, 并设置失效位,输入被阻断. 进入循环, 用cin.clear() 恢复输入

     while (cin.get() != '\n')  continue; //因为输入的非数字还留在输入队列,所以把它们清除,它们以 '\n'结束

}

欢迎大家提出批评和建议。

本文地址:http://com.8s8s.com/it/it22343.htm