今天我遇到了这个博客.最吸引我的是这个:
int i;
i["]<i;++i){--i;}"];
Run Code Online (Sandbox Code Playgroud)
好吧,我真的不知道数组下标中奇怪的"字符串常量"的目的是什么,但我很困惑如何下标整数变量.所以我带来了这段代码:
#include <stdio.h>
int main(void) {
int x = 10;
printf("%d", x["\0"]); /* What is x["\0"]?! */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它使用MinGW和-Wall -ansi -pedantic编译时没有错误.然后该代码输出:105.
谁能解释这个?
编辑:我发现下标中必须有一个指针,否则我会得到编译时错误.
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;}"]
这如何作为一个条件陈述?
我们来看看下面的代码:
int arr[n];
// s.t. i<n
arr[i] = 12;
// s.t. i<n
*(arr + i) = 12;
Run Code Online (Sandbox Code Playgroud)
是arr[i]
一种合成糖*(arr+ i)
吗?
有人可以让我更深入地了解为什么这段代码的工作方式
#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int i;
for(i=0;i<5;i++)
{
printf("%d,%d \n",i[a],i[a]++);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是
2,1
3,2
4,3
5,4
6,5
Run Code Online (Sandbox Code Playgroud)
谢谢
一个补丁被发布到gcc,它提供了一个叫做向量订阅g ++的东西(gcc已经有了它).
如果a
是一个数组并且i
是一个int则i[a]
是合法的并且等于a[i]
.
double a[]{0.0, 1.0, 2.0, 3.0}; // C++11 style but would work in C++98 style too.
assert(a[2] == 2.0);
assert(2[a] == 2.0);
Run Code Online (Sandbox Code Playgroud)
那么,这是合法的标准C/C++还是gcc扩展?
实际上,谷歌显示MS Developer Studio也有这个.我查看了C++标准并没有看到它.
我才知道这个伎俩.
在C++中:
#include <iostream>
using namespace std;
int main() {
int i[3]={5,7,11};
cout << 2[i];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在C:
#include <stdio.h>
int main(void)
{
int i[3]={5,7,11};
printf("%d", 2[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,这些是允许的,两个输出都是11.
为什么我[2]可以表达为2 [i]?
显然,两者&a[i]
并a+i
返回int*
.问题是它们是否以相同的方式执行,因为有两个运算符,&a[i]
但只有一个运算符a+i
?
我正在尝试解决这个问题,它有一个向量,并且有一个导致负索引的指针。我想知道 C 是否会忽略它并将其视为正数,或者它在向量中向后移动,例如 -1 是数组的最后一个元素。