以双引号开头的行是什么意思?

时间:2012-07-10 22:12:52

标签: c

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

"a"[3<<1];

有谁知道答案?

5 个答案:

答案 0 :(得分:13)

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

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

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

具有相同的效果
char c = 'b';

答案 1 :(得分:3)

想一想:

"Hello world"[0] 

'H'

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

答案 2 :(得分:3)

它确实有意义。提示:a[b]表示与*(a+b)完全相同。 (但我认为这不是一个很好的面试问题。)

答案 3 :(得分:2)

"a"是一个包含2个字符'a'0的数组。 3 << 13*2 = 6,因此它正在尝试访问2元素数组的第7个元素。这是未定义的行为。

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

答案 4 :(得分:1)

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

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