用这个模块来专门记述最近复习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)