int main()
{ char *arr="\\0\1\8234\0"; int i=0;
while(arr[i])
{ switch(arr[i])
{
case '0': printf("is no"); break;
case '00': printf("is debugging\n"); break;
case 0: printf("It is Avishkar\n"); break;
case '\\': printf("This "); break;
case '\1': printf("t s"); break;
case '8': printf("o s"); break;
case '2': printf("imp"); break;
case '3': printf("le as"); break;
case 2: case 3: case 4:
case 8: printf("This "); break;
default: printf(" it seems\n"); break;}
i++; } }
请解释o / p? 我无法得到它..
答案 0 :(得分:4)
打破我们的字符串初始化:
\\ == literal \ character \1 == octal representation of integer "1" \8 == technically invalid standard C, microsoft compilers will treat an unsupported (i.e. non-octal, non-escape, non-hex-specifier) character after a slash as if the slash were not present, so this is ascii '8' 2 == ascii '2' 3 == ascii '3' 4 == ascii '4' \0 == literal zero
arr[ 0 ] = '\\'; // literal backslash
arr[ 1 ] = '0'; // ascii '0'
arr[ 2 ] = 1; // integer 1
arr[ 3 ] = '8'; // using microsoft (non-portable) syntax
arr[ 4 ] = '2'; // ascii '2'
arr[ 5 ] = '3'; // ascii '3'
arr[ 6 ] = '4'; // ascii '4'
arr[ 7 ] = 0; // integer 0
循环打印i的每个连续值:
i == 0: "This " i == 1: "is no" i == 2: "t s" i == 3: "o s" i == 4: "imp" i == 5: "le as" i == 6: "it seems"
字面上:
这并不像看起来那么简单
尾随\ 0将导致while(arr [i])失败,并且当i == 7时循环停止。
虽然这可能会导致编译器在非Microsoft编译器上抱怨。
答案 1 :(得分:1)
\\
意味着只是削减字符。 \1
表示代码为1的字符。\8
很棘手 - 它会产生斜杠和8
,因为\
需要八进制,而8不是有效的八进制数字。最后的\0
是多余的,因为C常量字符串自动以\0
结尾,但它会产生代码为0的字符,在C中表示字符串的结尾。
通常,在C字符串\xxx
中,xxx
是八进制数字表示带有代码xxx
的字符 - 例如\12
表示代码为10的字符(八进制12
)。
答案 2 :(得分:0)
通常,\ 0转义是char值0 - 用于标记char*
样式字符串结尾的空终止符。像“foo”这样的文字会被编译器自动终止;只有当你构造一个带有初始化语法(char foo[] = { 'a', 'b', 'c', '\0'};
)的char数组时,你才需要明确地使用\ 0。在这种情况下,你也可以使用整数文字0(没有引号)。
嵌入空值的大多数其他事件都是特定于上下文的。例如,一些Win32 API函数期望char
数组以空值终止以指示列表中项目之间的分隔,然后双空终止以指示列表的结尾。您的示例代码似乎不是这种情况。
您的示例代码似乎是一些有意混淆的代码,只是打印一条简单的消息。 \ 0似乎是一个红色的鲱鱼 - 这是不必要的。当arr [i]为'4'时,代码将打印'似乎\ n'并递增i,因此arr [i]现在是\ 0。这相当于0,这将导致while循环终止,无论如何由于字符串中的隐式空终止符而发生。
N.B。代码使用一些可疑的东西,如多字符文字和\ 8转义。我不确定它是否会按预期发挥作用。
答案 3 :(得分:0)
从你的代码:
\\ - \ (Slash character)
\0 - 0 (Null-terminated character which simply appends '0')
注意:\ 0永远不是case语句,因为当while(0)
结束你的循环时。
答案 4 :(得分:0)
char *arr="\\0\1\8234\0"; int i=0;
\\
是一个转义反斜杠。 (之后的零是不转义。)
\1
表示八进制ASCII码1的字符。(\8
是无效的转义码;流行的GCC编译器忽略反斜杠,但不应该依赖于该行为。)
\0
表示一个空字节,它是用于终止C字符串的字符。 C编译器会在双引号末尾自动添加另一个空字节串;在您的情况下,没有必要明确包含它。
程序迭代字符串中的字符,直到它到达第一个空字节,即字符串结尾的标记(while(arr[i]) { ... i++; }
)。对于每一个,它使用switch
语句将其与其他几个值进行比较。
因此,程序的输出为"This is not so simple as it seems\n"
。
此行永远不会执行,因为控件在此之前会离开while
循环:
case 0: printf("It is Avishkar\n"); break;
请注意,因为零不是单引号作为字符文字,所以它引用字符代码,而不是表示的实际字符。
这些行也没有执行:
case '00': printf("is debugging\n"); break;
case 8: printf("This "); break;
前者使用多字符文字(不要与双引号字符串混淆),它具有实现定义的行为。 GCC将字符打包成int
,因此该编译器的结果值为12336。当然,它不等于在字符串中找到的任何字符值;看到这个编译器警告:
prog.c:7:警告:案例标签值超过类型
的最大值
后者指的是十进制ASCII码8.如上所述,这与'8'
不同。