首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语感和表情?

语感和表情?
EN

Stack Overflow用户
提问于 2014-03-13 13:41:54
回答 2查看 224关注 0票数 0

所以我在我的sizeof()书里读了一个关于C++的章节。我所读到的是,如果操作数是一种类型,则只需要括号后的括号,当您有表达式时,您可以跳过括号,所以我做了自己的测试,看看这是怎么回事。我使用了以下代码来查看我将得到什么:

代码语言:javascript
复制
int main(){

    cout << sizeof 5 + 5<< endl;
    cout << sizeof 10 - 5<< endl;
    cout << sizeof 5 * 5<< endl;
    cout << sizeof 4.5 + 5.5<< endl;
    cout << sizeof 10.5 - 5.5<< endl;
    cout << sizeof 2.5 * 5<< endl;
    cout << sizeof 10.0 / 5.0<< endl;
    cout << endl;

    cout << sizeof 5 << endl;
    cout << sizeof 5.0 + 5.0 << endl;
    cout << sizeof 5.5 << endl; 

    return 0;
}

我得到的输出是:

代码语言:javascript
复制
9
4294967295
20
13.5
2.5
40
1.6
4
13
8

这是如何工作的呢?当我有两个整数类型,bot 4字节,当做一个加法时,它是如何变成9字节的?+操作符是一个字节造成的吗?但是,如果是这样的话,那么10-5是如何成为4294的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-13 13:43:45

sizeof 5 + 5 --由于运营商的优先级,它被解析为(sizeof(5)) + 5而不是sizeof(5+5),因此它变成了4 + 59。有关这方面的更多信息,如克里斯所说,请看一看这张桌子

对于子字符串,它是相同的,但是由于表达式的类型是size_t,它是无符号的,所以子字符串是在2^32 (即4,294,967,296 )周围环绕的无符号ints上完成的。因此,sizeof 10 - 54 - 5,它在32位无符号算术中变成了(4,294,967,296) - 1,这就是你要得到的4,294,967,295

再进一步

在编译过程的解析步骤内部,每个源代码语句都被转换为表达式树(通常称为天冬氨酸),如果您对这些事情感兴趣,可以以看这儿为例。

要了解更多实际情况,请安装嘎吱声编译器并使用

代码语言:javascript
复制
clang -Xclang -ast-dump -fsyntax-only source.cpp

它显示代码中的树。非常好,但是我重新推荐了简短的代码,因为否则输出可能会很大;)

票数 16
EN

Stack Overflow用户

发布于 2014-03-13 13:47:55

它只对它之后的第一件事有约束力。

整数文字是四个字节,而浮点数文字是八个字节。然后,用加法、减法、乘法或除法对这两个值进行跟踪,得到预期的数学结果。例如(5) -> 4,4+5 -> 9。

您的示例中的第二个值是大的,因为有欠流(4294967295 == 0xFFFFFFFF == 4-5在无符号使用中)。

祝好运!

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

https://stackoverflow.com/questions/22380464

复制
相关文章

相似问题

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