用这个模块来专门记述最近复习c语言中一些容易忽视的问题。


1、XOR(异或) 操作:相同为1 不同为0;

2、char ch;                    //getchar()返回值是一个int型数据

      while((ch = getchar()) != EOF);                          EOF:一些函数读取出错(比如getchar())或读完文件之后会返回 EOF 。一般头文件会定义它为 -1
          有符号字符集时 读取一个'/377'的字节后循环就会停止          如果为有符号就会被解释成 -1
          无字符集的机器 读取一个'/377'的字节后循环会不停止     /377 表示一个8进制   1111 1111B  = 0xff   = 255   

3、sizeof(a = b+1)     判断表达式的长度并不需要对表达式求值,所以该单目操作符,并没有向a赋任何值。

4、 ++a = 10;   ❌     

    ps   左值:应该标识一个特定位置。        右值:  标识一个值       ++a的结果是a值得拷贝,并不是变量本身,你无法向一个值进行赋值。

5、在c中你必须使用 == 来执行比较。所以常常会写成  if(x  = 5)  ;     关键是它还是合法的。由于表达式的值是x的新值,if语句始终为真。

          所以     if(5 == x)  来防止错误 

6、 逗号操作符:  if( b+1, c/2, d>0)  如果d>0那么整个表达式值就为真。前面两个表达式的求值就毫无意义。被简单抛弃。

    它也有好处。 a = get_value();                                                            while( a = get_value(),count_vlaue(a),a>0){     

           count_value(a);                              。。。。

           while(a > 0) {                         }

              ...                  →→→→→

              a = get_value();

              count_value(a);

            }           右边的的程序 :获取下一次的值只需要出现一次。逗号操作符使程序更易于维护。如果将来需要改变下一次获取                          的那里,代码中只需要一个地方修改

7、算术运算——不同类型的赋值。 

    下面这段代码存在一个问题    int a = 5000;    int b = 25; long  c = a * b;

              问题在于a * b 是以整型来进行计算。 在32位整数的机器上,这段代码运行毫无问题,但是在16位整数的机器上。这个乘法运算就会溢出,这样c就会被初始化位错误的值

        解决办法是:   long c = (long) a * b;    这里还不太清楚  先写下,再看。

8、这是一段狡猾的程序。  求下面程序的结果是什么?

 1 int  func (void)
 2 {
 3   static int counter = 1;
 4    return ++counter;          
 5 }
 6 int main()
 7 {
 8   int answer;
 9   answer = func() - func() * func();
10   printf()"%d\n, answer);    
11 }

比较明显的答案就是   -10 (2 - 3 * 4)   但实际上它因编译器而定。乘法是要在加法之前完成。但没有规定调用完成的顺序。因此下面的答案都正确。

                    -10   (2-3*4)or (2-4*3)  

                    -5      (3-2*4)   or  (3-4*2)

                    -2        (4-2*3)  or (4-3 *2)