做一些考试准备,这是一个过去的问题。
用具有相同功能的简单编程风格描述以下C部分的内容和重写内容。 (糟糕的缩进是问题的意图)。
关于A部分,我不确定未签名的演员对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;}
任何帮助将不胜感激,谢谢。
答案 0 :(得分:2)
!!
否定布尔表达式两次,实质上是将表达式值转换为0
或1
。
与C一样,除零以外的所有值均为真,零表示为假,!!
可用于将其转换为0
或1
,如果您需要使用稍后它在函数或表达式中不接受任何true值,只有数字1
。
关于其余部分:unsigned
将您的int a
的内部代表性从您的函数参数解释为unsigned int
,因此例如-1
变为4294967295
编译器使用two's complement和4个字节的整数。
关于对long
的投射:除非你完全知道自己在做什么,否则强烈建议在类似的情况下反对。在您的示例中,它将一些指针算法用于将指针解释为数值,基本上使用变量的地址,就好像它们只是数字一样。他们可能选择long
,因为在他们的系统上它具有与指针完全相同的大小。并非所有系统都保证如此。
所以,对你的问题给出一个非常简短的答案:代码对undefined behavior表达{{3}},除了!!
,如果表达式为零,它只给0
,并且否则1
。
答案 1 :(得分:0)
运算符!
是逻辑否定。
!true
为false(0
),!false
为真(1
)。
当一个值用作布尔值时,除了0
(在很大意义上为0
)之外的任何其他内容都为真; 0
是假的。
因此,!!(*z)
的值为0
或1
。
如果0
*z
以NULL
开头,则为1
如果*z
不是NULL
,则为{{1}}。
答案 2 :(得分:0)
!是没有的布尔运算符。
false为0,C中的true为1。
所以当你接受任何不是0的int时,你就跑了!在它上面,你将得到0(真为假),零将成为一。
所以!!的行动!将每个非零值更改为1,并将每个0更改为0。