做一些考试准备,这是过去的问题。
描述以下 C 代码的作用,并以简单的编程风格重新编写具有相同功能的代码。
(错误的缩进是问题的意图)。
关于 A 部分,我不确定 unsigned cast 对 a 做了什么。我已经测试了几次,但似乎无法得到有意义的结果。
同样,在 B 中,我不确定 while 循环如何处理长投和 !!成为另一个问题
代码:
//代码A部分
int f(int a,int b){
return(((unsigned) a)>b);}
//代码B部分
int h(int *x, int y){
int * z= x-- +y;
w=0;
while( (long) z-- ^(long) x) w += !!(*z);
return w;}
如有任何帮助,我们将不胜感激。
!!
对 bool 表达式求反两次,本质上是将表达式值转换为 0
或 1
。
因为在 C 中,除零以外的所有值都表示为真,零表示为假,可以使用 !!
将其转换为 0
或 1
,如果您稍后需要在不接受任何 true 值的函数或表达式中使用它,则只接受数字 1
。
关于其余部分:unsigned
将您的 int a
的内部表示从您的函数参数解释为 unsigned int
,例如 -1
变为 4294967295
如果您的编译器使用 two's complement和 4 字节整数。
关于转换为 long
:我强烈建议不要在类似情况下使用,除非您绝对知道自己在做什么。在您的示例中,它执行一些指针运算,将您的指针解释为数值,本质上是处理变量的地址,就好像它们只是数字一样。他们可能选择了 long
,因为在他们的系统中它的大小与指针完全相同。不能保证在所有系统上都是如此。
因此,对您的问题给出一个非常简短的答案:代码执行 undefined behavior使用这些表达式,除了 !!
如果表达式为零则只给出 0
,否则为 1
。