汉扬编程 编程大纲 C语言——右移的规则是这样吗?

C语言——右移的规则是这样吗?

在日常中,左移和右移都经常使用,对于左移而言,其规则是:

C语言——右移的规则是这样吗?

高位丢弃,低位补0但是对于右移而言,其移位规则呢?说到这里,必须先引出两个概念:逻辑移位,算术移位。其具体规则为:

逻辑移位:移出的空位都用0补充算术移位:对于操作数是无符号型,算术移位等同于逻辑移位; 对于有符号型,算术右移根据符号位填充移出的空位,正数补0,负数补1.了解了两种移位,明显左移用的是逻辑移位。那么右移用什么规则呢?在C语言中,右移逻辑还是算术移位没有规定,是未定义行为。具体由编译器来决定。目前大部分编译规则是:

有符号数:算术右移无符号数:逻辑右移针对这种规则,所以对操作数需要重视,防止类型的问题或者编译器的问题发生不必要的错误。比如:

某表达式结果的每一bit代表某事件发生情况,若表达式未加以约束,则通过右移可能不是预想的值。

往期推荐了解一哈柔性数组

C语言中inline函数

忽视的sizeof返回值类型

C语言笔记-复杂指针的识别方法(右左法则)

在c语言学习中我们经常看到一些定义的很复杂的名称,我们可以根据以下规则来识别其定义的内容和含义,举例来看:

int (*(*func)[5])(int *p);

func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

总结就是:

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值

  输入:
3—7
2—1
得出错误结果。
而当输入n=3
0—1—3
3—0—2
5—2—0
时也会得出错误结果。
  
错误的原因有2:
1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除法,结果是取整整数,虽然他使用了类型强制转换,但结果显然不同,有误差而且有时候这个误差很大形成错误。
  
2 是算法有点问题。小可很欣赏匿名的算法思路,简洁明快。不过有相当缺陷,这在程序中注明。
下面的程序是在匿名的程序思路上改写的。考虑到数据类型和精确度问题,程序中行列式数据使用double型。由于tc和win-tc是16位编辑器,对float型和double型数据支持不好,所以程序是在32位编辑器Dev-c 下调试并通过的。
  
本题的一个完整的c程序如下,程序在Dev-c 下都调试通过,结果正确。
/* 用C语言解决:求任意阶(n阶)矩阵的行列式值 */
#include
#include
void getarray(int n);
void showarray(int n);
double getresult(int n);
double array[10][10];/*设矩阵不超过10阶,可更改*/
int main()
{
int n;
double result;
printf(\”

Please input the Array size n:\”);
scanf(\”%d\”,&n);
getarray(n);
showarray(n);
result=getresult(n);
printf(\”

Result=%f

\”,result);
system(\”pause\”);
return 0;
}
void getarray(int n)
{
int row,col;
for(row=0;row{
printf(\”

Please input line %d:\”,row 1);
for(col=0;colscanf(\”%lf\”,&array[row][col]);
}
}
void showarray(int n)
{
int row,col;
printf(\”

A=\”);
for(row=0;row{
for(col=0;colprintf(\” %f\”,array[row][col]);
printf(\”

\”);
}
}
double getresult(int n)
{
double temp,result=1。
  0;
int switchtime=0,flag=0;
int row,nextrow,col,stemp;
for(row=0;row{
nextrow=row 1;
if(array[row][row]==0)/* 开始处理第一列,如果行列式第一行第一个数为零,要交换行 */
{ while(array[nextrow][row]==0)
{
nextrow ; /* 如果行列式第二行第一个数为零,行增加继续寻找非零数值的行 */
if(nextrow==n)/* 如果遍历完行列式行列式第一列元素都为零,退出while循环 */
{ flag=1;
break;
}
}
if(flag==1) /* 退出while循环后回到for(row=0;rowcontinue; /* 从array[row][row]==0知列也相应加1,开始处理第二列 */
switchtime ; /* 每交换一次行,行列式符号变化1次,统计变化次数 */
for(col=0;col{
stemp=array[row][col];
array[row][col]=array[nextrow][col];
array[nextrow][col]=stemp;
}
}
for(nextrow=row 1;nextrow{ /* 类似高斯消去法,消第一行下各行第一列数值到零*/
temp=array[nextrow][row]/array[row][row];
for(col=0;colarray[nextrow][col] =-temp*array[row][col];/* 化行列式为上三角行列式形式 */
}
}
showarray(n);
for(row=0;rowresult*=array[row][row];
if(switchtime%2)
return -result;
else
return result;
}。
  

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/5942.html

搜狗C2评测:录音笔中的模范生,多功能使用更适合中国新青年

C\\C++语言27|多线程编程

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部