Sizeof和表达式?

gEd*_*ger 0 c++

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是这样的:

9
4294967295
20
13.5
2.5
40
1.6
4
13
8
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?当我有两个整数类型,机器人4个字节,当做一个加法时,它如何变成9个字节?是由于+运营商的一个字节?但是,如果是这样,那么10-5是如何以4294的形式出现的呢?

Ant*_*ine 16

sizeof 5 + 5它被解析为(sizeof(5)) + 5而不是sizeof(5+5)由于运营商的优先级,因此它变为4 + 59.有关这方面的更多信息,比如克里斯说,请查看此表.

对于减法它是相同的,但由于表达式的类型size_t是无符号的,减法是在无符号整数上完成的,它包裹着2^324,294,967,296.Thererfore,sizeof 10 - 54 - 5其成为(4,294,967,296) - 132位无符号运算,这就是4,294,967,295你得到.

走得更远

在编译过程的解析步骤内部,每个源代码语句都转换为表达式树(通常称为AST),如果您对这些事情感到好奇,可以在这里查看例子.

要获得更实际的实践理解,请安装clang编译器并使用

clang -Xclang -ast-dump -fsyntax-only source.cpp
Run Code Online (Sandbox Code Playgroud)

它显示代码中的树.真的很好,但我推荐短代码,因为输出可能是压倒性的;否则;)