gpt4 book ai didi

c - 什么是 >>>= C 中的运算符?

转载 作者:太空狗 更新时间:2023-10-29 16:13:38 26 4
gpt4 key购买 nike

同事给的一个谜题,我想不通这个C程序到底是怎么编译运行的。这个 >>>= 运算符和奇怪的 1P1 文字是什么?我已经在 Clang 和 GCC 中进行了测试。没有警告,输出为“???”

#include <stdio.h>

int main()
{
int a[2]={ 10, 1 };

while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
printf("?");

return 0;
}

最佳答案

行:

while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )

包含 digraphs :><: , 转换为 ][分别,所以它相当于:

while( a[ 0xFULL?'\0':-1 ] >>= a[ !!0X.1P1 ] )

文字 0xFULL0xF相同(这是 15 的十六进制); ULL只是指定 it's an unsigned long long literal .无论如何,作为 bool 值它是真的,所以 0xFULL ? '\0' : -1评估为 '\0' ,这是一个 character literal其数值只是0 .

与此同时,0X.1P1hexadecimal floating point literal等于 2/16 = 0.125。在任何情况下,作为非零值,它作为 bool 值也是正确的,因此用 !! 取反两次。再次产生1 .因此,整个事情简化为:

while( a[0] >>= a[1] )

运营商>>=compound assignment将其左操作数向右移动右操作数给定的位数,并返回结果。在这种情况下,右操作数 a[1]始终具有值 1 ,所以它等同于:

while( a[0] >>= 1 )

或者,等价地:

while( a[0] /= 2 )

a[0]的初始值是10。右移一次后变成5,然后(向下舍入)2,然后是1,最后是0,此时循环结束。因此,循环体被执行了 3 次。

关于c - 什么是 >>>= C 中的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25495042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com