在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?
每个答案只能有一个功能.
以下无法编译:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
Run Code Online (Sandbox Code Playgroud)
但如果我改成它
sizeof(arr);
Run Code Online (Sandbox Code Playgroud)
一切都好.为什么?
我的一个朋友第一次学习C++,并发给我这个片段:
int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 };
char bar[] = " abcdefghijklmnopqrstuvwxyz01234567890+-,.!?-_";
for (int i = 0; i < 10; ++i) {
std::cout << foo[i][bar];
}
Run Code Online (Sandbox Code Playgroud)
乍一看,我告诉他它不会工作 - 我认为它不会编译,或者至少会导致访问冲突,因为foo
它不是一个二维数组,他回答说它确实如此.
我为自己试了一下,令我惊讶的是,这个片段完全没问题.问题是:为什么?
根据逻辑,常识和良好实践,语法应该是bar[foo[i]]
.
我很惭愧地承认我不知道发生了什么.foo[i][bar]
在这种情况下,什么使有效的语法?
#include <iostream>
using namespace std;
int main()
{
int arr[3] = { 10, 20, 30 };
cout << arr[-2] << endl;
cout << -2[arr] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
4196160
-30
Run Code Online (Sandbox Code Playgroud)
这arr[-2]
超出范围并且无效,导致未定义的行为.但-2[arr]
评估为-30
.为什么?
不arr[-2]
等于-2[arr]
?
由Stanley B. Lippman撰写的C++ Primer第5版(ISBN 0-321-71411-3/978-0-321-71411-4)提到:
An
[std::]array
是一种更安全,更易于使用的内置阵列替代方案.
内置阵列有什么问题?
今天,我偶然发现了一个谜语,这给我带来了新的惊喜。
我不认为下面的示例中的-1 [p]可以编译,但是可以。实际上,x最终为-3。
int x;
int array[] = {1, 2, 3};
int *p = &array[1];
x = -1[p]
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索了-1 [pointer]之类的东西,但找不到任何东西。好的,我承认很难输入正确的搜索查询。谁知道为什么-1 [p]编译而X变为-3?
array [index]和index [array]的可能性是编译器功能还是语言功能.第二个怎么可能?
在C#(和Java)中,字符串只是一个具有存储长度的char数组,并且添加了一些方法.同样地,(参考与值之外的东西除外)对象只不过是带有继承和接口的美化结构.
在一个层面上,这些新增功能感觉就像是清晰的功能和增强功能.在另一个层面上,他们觉得从"语法糖"状态的边缘升级.
为了进一步考虑这个想法,请考虑(我可能有一些细节错误,但重点仍然是):
transistor
elementary logic gate
compound gate
| |
ALU flip-flop
| | |
| register RAM
| |
CPU
microcode
assembly
C
C++
| |
MSIL JavaScript
C# jQuery
Run Code Online (Sandbox Code Playgroud)
很多时候,任何单一的抽象层看起来都像语法糖,但是多层分离感觉彼此之间的距离非常小.
你怎么知道什么东西停止了语法糖并开始成为一个真正的功能?