我在其中一次采访中被问到,C中打印的以下行是什么?在我看来,以下行没有任何意义:
"a"[3<<1];
有谁知道答案?
答案 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 << 1
是3*2 = 6
,因此它正在尝试访问2元素数组的第7个元素。这是未定义的行为。
(此外,即使未删除未定义的行为,代码也不会打印任何内容,因为不会调用打印函数。)
答案 4 :(得分:1)
“some_string”[i]返回给定字符串的第i个字符。 3<<1
是6.所以"a"[3<<1]
尝试返回字符串“a”的第6个字符。
换句话说,代码调用未定义的行为(因此,从某种意义上说,确实没有意义),因为它正在访问一个超出边界的char数组。