所以我刚读了一篇关于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; }
我得到的输出是这样的:
9 4294967295 20 13.5 2.5 40 1.6 4 13 8
这是如何运作的?当我有两个整数类型,机器人4个字节,当做一个加法时,它如何变成9个字节?是由于+
运营商的一个字节?但是,如果是这样,那么10-5是如何以4294的形式出现的呢?
sizeof 5 + 5
它被解析为(sizeof(5)) + 5
而不是sizeof(5+5)
由于运营商的优先级,因此它变为4 + 5
和9
.有关这方面的更多信息,比如克里斯说,请查看此表.
对于减法它是相同的,但由于表达式的类型size_t
是无符号的,减法是在无符号整数上完成的,它包裹着2^32
它4,294,967,296
.Thererfore,sizeof 10 - 5
是4 - 5
其成为(4,294,967,296) - 1
32位无符号运算,这就是4,294,967,295
你得到.
走得更远
在编译过程的解析步骤内部,每个源代码语句都转换为表达式树(通常称为AST),如果您对这些事情感到好奇,可以在这里查看例子.
要获得更实际的实践理解,请安装clang编译器并使用
clang -Xclang -ast-dump -fsyntax-only source.cpp
它显示代码中的树.真的很好,但我推荐短代码,因为输出可能是压倒性的;否则;)