5

我在一次采访中被问到,以下行在 C 中打印什么?在我看来,以下行没有任何意义:

"a"[3<<1];

有人知道答案吗?

4

5 回答 5

13

令人惊讶的是,它确实有一个含义:它是对表示字符串文字的字符数组的索引。顺便说一句,这个特定的索引位于6,超出了文字的限制,因此是未定义的行为。

您可以构造一个遵循相同基本模式的表达式:

char c = "quick brown fox"[3 << 1];

将具有相同的效果

char c = 'b';
于 2012-07-10T22:14:26.867 回答
3

想想这个:

"Hello world"[0] 

'H'

"Hello world"是一个字符串文字。字符串字面量是一个数组,char并被转换为指向表达式中数组第一个元素的指针。"Hello world"[0]表示数组的第一个元素。

于 2012-07-10T22:14:34.090 回答
3

它确实有意义。提示:a[b]意思完全一样*(a+b)。(不过,我认为这不是一个很好的面试问题。)

于 2012-07-10T22:15:02.347 回答
2

"a"是一个由 2 个字符组成的数组,'a', 和0. 3 << 13*2 = 6,所以它试图访问 2 元素数组的第 7 个元素。那是未定义的行为。

(此外,即使删除了未定义的行为,代码也不会打印任何内容,因为没有调用打印函数。)

于 2012-07-10T22:16:47.780 回答
1

"some_string"[i] 返回给定字符串的第 i 个字符。3<<1是 6。因此"a"[3<<1]尝试返回字符串“a”的第 6 个字符。

换句话说,代码调用了未定义的行为(因此,从某种意义上说,确实没有任何意义),因为它正在越界访问 char 数组。

于 2012-07-10T22:16:51.693 回答