我在一次采访中被问到,以下行在 C 中打印什么?在我看来,以下行没有任何意义:
"a"[3<<1];
有人知道答案吗?
令人惊讶的是,它确实有一个含义:它是对表示字符串文字的字符数组的索引。顺便说一句,这个特定的索引位于6
,超出了文字的限制,因此是未定义的行为。
您可以构造一个遵循相同基本模式的表达式:
char c = "quick brown fox"[3 << 1];
将具有相同的效果
char c = 'b';
想想这个:
"Hello world"[0]
是'H'
"Hello world"
是一个字符串文字。字符串字面量是一个数组,char
并被转换为指向表达式中数组第一个元素的指针。"Hello world"[0]
表示数组的第一个元素。
它确实有意义。提示:a[b]
意思完全一样*(a+b)
。(不过,我认为这不是一个很好的面试问题。)
"a"
是一个由 2 个字符组成的数组,'a'
, 和0
. 3 << 1
是3*2 = 6
,所以它试图访问 2 元素数组的第 7 个元素。那是未定义的行为。
(此外,即使删除了未定义的行为,代码也不会打印任何内容,因为没有调用打印函数。)
"some_string"[i] 返回给定字符串的第 i 个字符。3<<1
是 6。因此"a"[3<<1]
尝试返回字符串“a”的第 6 个字符。
换句话说,代码调用了未定义的行为(因此,从某种意义上说,确实没有任何意义),因为它正在越界访问 char 数组。