这怎么可能是有效的C++?
void main()
{
int x = 1["WTF?"];
}
Run Code Online (Sandbox Code Playgroud)
在VC++ 10上,这个编译并在调试模式下x
,语句之后的值为84.
这是怎么回事?
在3["XoePhoenix"]
,数组索引是字符数组的类型.我们可以在C中这样做吗?数组索引必须是整数是不是真的?
什么3["XeoPhoenix"]
意思?
这个问题问为什么
a[5] == 5[a]
Run Code Online (Sandbox Code Playgroud)
除了一个......
为什么一个允许在一个整数后面放一个数组下标?为什么不允许写一些类似的东西
[a]5
Run Code Online (Sandbox Code Playgroud)
要么
[5]a
Run Code Online (Sandbox Code Playgroud)
或者放在[]
其他一些奇怪的地方?
换句话说,允许数组索引运算符的定义是什么?
编辑I: 我收到的引用标准的答案起初有点难以理解.但在我现在明白的响应者的帮助下.指针或整数后允许使用数组下标(方括号).如果它跟在指针之后,括号内的内容必须是整数.如果它跟一个整数,括号内的内容必须是一个指针.
我接受了那个不太热烈的回答,因为他让我理解标准中的引用更多的手握.但严格引用标准的答案也是正确的.起初只是难以理解.
编辑II: 我认为我的问题不重复.我的问题是关于数组下标运算符的允许语法.它被标准中的引用所回答,这些引用从未出现在我认为重复的问题中.它是相似的,是的,但不是重复的.
我刚刚发现了我的代码中似乎是一个错误,但不仅仅是编译,它最初也能正常工作......
考虑以下代码snipet:
#include <string>
#include <iostream>
using namespace std;
class WeirdTest
{
public:
int value;
string text;
WeirdTest() : value(0),
text("")
{}
virtual ~WeirdTest()
{}
void doWeirdTest()
{
value = 5;
string name[] =
{
"Zero",
"One",
"Two",
"Three",
"Four",
"Five"
};
text = value[name];
cout << "text: " << text << endl;
}
};
int main(int argc, char** argv)
{
WeirdTest test;
test.doWeirdTest();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而不是text=value[name];
它应该是,text=name[value];
但编译器不会抱怨,并且得到的二进制代码完全相同,无论"bug"是否在这里.我正在使用g ++ …
在C中,阵列订阅:a[b]
仅仅是还原糖等效指针运算之后解除引用的句法:*(a+b)
(如所解释的,比方说,在这里).
对于基类型,如何在C++中解释数组订阅?(不适用于我们有超载语义的类)?而且,更具体地说,C++期望作为下标出现什么类型?是一个ptrdiff_t
吗?
#include <stdio.h>
int main(){
int array[] = {1,2,3};
printf("L00: array[0]=%d \n",array[0]);
printf("L01: array[1]=%d \n",array[1]);
printf("L02: array[2]=%d \n",array[2]);
printf("L03: &array[0]=%p \n",&array[0]);
printf("L04: &array[1]=%p \n",&array[1]);
printf("L05: &array[2]=%p \n",&array[2]);
printf("L06: array=%p \n",array);
printf("L07: &array=%p \n",&array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个程序中,L03,L06,L07和显示(&array
,array
,和&array[0]
,分别地)相同的存储器地址.
所以我很好奇"阵列"作为RAM中变量的位置.
如果RAM中没有"数组"的位置,它在哪里?
int a[] = { 1, 2, 3, 4, 5 };
const int N = sizeof(a)/sizeof(a[0]);
cout<<N<<endl;
for (int i = 0; i < N; ++i)
{
cout << (i[a-i]%N)[a+i-1] << " ";
}
Run Code Online (Sandbox Code Playgroud)
//它打印1 2 3 4 5,即我不理解的数组是cout <<(i [ai]%N)[a + i-1] <<"";
什么是一元 - 并在这里做?
int * a = 1990;
int result = &5[a];
Run Code Online (Sandbox Code Playgroud)
如果您要打印,result
您将获得2010年的价值.
您必须使用-fpermissive
它编译它,否则它将因错误而停止.
检查IOCCC中的这个混淆代码.我试图理解这一点.
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
Run Code Online (Sandbox Code Playgroud)
手段:
int i;
main()
{
for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hello, world!\n",'/'/'/'));
}
read(j,i,p)
{
write(j/p+p,i---j,i/i);
}
Run Code Online (Sandbox Code Playgroud)
请解释一下: i["]<i;++i){--i;}"]
这如何作为一个条件陈述?