Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是;12345“+;2你在C中做什么?_C - Fatal编程技术网

什么是;12345“+;2你在C中做什么?

什么是;12345“+;2你在C中做什么?,c,C,我以前在C中见过这种情况: #define MY_STRING "12345" ... #define SOMETHING (MY_STRING + 2) 在这里,有些东西扩展到了什么?这合法吗?或者他们是这个意思 #define SOMETHING (MY_STRING[2]) 当您有一个数组或指针时,p+x相当于&p[x]。因此MY_STRING+2相当于和MY_STRING[2]:它产生字符串中第三个字符的地址 注意添加0时会发生什么MY_STRING+0与和MY_STRING[0]相

我以前在C中见过这种情况:

#define MY_STRING "12345"
...
#define SOMETHING (MY_STRING + 2)
在这里,有些东西扩展到了什么?这合法吗?或者他们是这个意思

#define SOMETHING (MY_STRING[2])

当您有一个数组或指针时,
p+x
相当于
&p[x]
。因此
MY_STRING+2
相当于
和MY_STRING[2]
:它产生字符串中第三个字符的地址


注意添加0时会发生什么
MY_STRING+0
和MY_STRING[0]
相同,两者都与简单地编写
MY_STRING
相同,因为字符串引用只不过是指向字符串中第一个字符的指针。令人高兴的是,身份操作“Add 0”是一个NO-op.认为这是一种智力单元测试,我们可以用来检查我们关于“<代码> +/>代码>的意思是正确的。

字符串文字存在于程序的固定数据段中,因此它们作为编译器的一种类型出现在指针中。

+-+-+-+-+-+--+
|1|2|3|4|5|\0|
+-+-+-+-+-+--+
 ^ MY_STRING
     ^ MY_STRING + 2

那么你没有编译器的是什么?更快?花了我60秒的时间…@Rook-编译它并查看它的功能是一回事,理解它是另一回事。@bta-编译并运行一些代码并查看输出花了你60秒。OP的目标是从不知道某种语法意味着什么,到知道它意味着什么。你不是在60秒内完成的。对于某些表达式,其含义很容易从给定的测试用例中推断出来,至少对于该测试用例是如此,但是对于许多测试用例,您将得到语法错误,或者没有可辨别的效果,或者不可理解的效果,或者误导性效果。任何试图通过反复试验来学习复杂编程语言的语法和语义的人都是妄想。@LarsH:我同意。这就是为什么我的声明只是一个评论而不是回答。我只是回应Joe的评论(尽管我现在看到我没有将我的评论标记为回复…),我想我的问题是我不知道带引号的字符串等于字符数组,至少在语法方面是这样的。谢谢+1.我也喜欢ASCII码艺术,所以我必须投票选这一个作为答案。所以这一个赢得了ASCII码艺术……;)@哈米什·格鲁比扬:是的,Unicode也是如此。L“StringLiteral”将具有
const wchar\u t*
类型,因此
+
将以
wchar\u t
s的数量前进。人类是视觉生物;如果它看起来不错,那么它一定是对的。