首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C中的>>>=运算符是什么?

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

Stack Overflow用户
提问于 2014-08-26 06:03:05
回答 1查看 20.4K关注 0票数 295

我不明白这个C程序实际上是如何编译和运行的,这是一个同事给出的难题。这个>>>=操作符和奇怪的1P1文字是什么?我已经在克隆和GCC上测试过了。没有任何警告,输出为“?”

代码语言:javascript
复制
#include <stdio.h>

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

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

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-26 06:17:58

这行代码:

代码语言:javascript
复制
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )

包含digraphs :><:,分别转换为][,因此等效于:

代码语言:javascript
复制
while( a[ 0xFULL?'\0':-1 ] >>= a[ !!0X.1P1 ] )

文字0xFULL0xF相同(对于15是十六进制);ULL只是指定了it's an unsigned long long literal。在任何情况下,作为布尔值,它都是真的,所以0xFULL ? '\0' : -1的计算结果是'\0',这是一个数值仅为0character literal

同时,0X.1P1是等于2/16 = 0.125的hexadecimal floating point literal。在任何情况下,它都是非零的,作为布尔值也是真的,所以再次用!!对它求反两次会产生1。因此,整个过程简化为:

代码语言:javascript
复制
while( a[0] >>= a[1] )

运算符>>=是一个compound assignment,它将其左操作数向右移位由右操作数给出的位数,并返回结果。在这种情况下,右操作数a[1]的值始终为1,因此它等效于:

代码语言:javascript
复制
while( a[0] >>= 1 )

或者,等效地:

代码语言:javascript
复制
while( a[0] /= 2 )

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

票数 469
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25495042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档