2012-07-23 55 views
0
#include<stdio.h> 
void main() 
{ 
char ***p="hello"; 
printf("%c",++*p++); 
} 

我不明白为什么(*)间接运算符在这里使用三次。用“C”写下面代码的输出是什么?

当我编译这个程序,然后输出是“j”。 但实际上听到p是指向指向字符数组的指针的指针。 那么为什么我得到的输出为j。 我不明白这背后的逻辑是什么。 请帮我理解这背后的实际逻辑。

而且混乱增加更多的时候我只用一个间接运营商并得到遵守的程序。然后,输出I .means

void main() 
{ 
char *p="hello"; 
printf("%c",++*p++); 
} 
+0

只是想让你知道'void main'不是C:http://stroustrup.com/bs_faq2.html#void-main – chris 2012-07-23 16:49:45

+3

它是未定义的行为。 [任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)](http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behavior -iiiii等) – pmr 2012-07-23 16:50:27

+2

它看起来像依赖于所有未定义的行为。 – Wug 2012-07-23 16:50:56

回答

1

首先,它是一个未定义的行为。

其次,它不是一个正确的C(或C++)代码。由于非常量字符指针,它会生成此警告。

3.c: In function 'main': 
3.c:5:12: warning: initialization from incompatible pointer type [enabled by default] 
    char ***p="hello"; 
      ^

更好做这种方式:

#include <stdio.h> 

int main() 
{ 
    const char ***p="hello"; 
    printf("%c",++*p++); 

    return 0; 
} 

和关于它打印:程序已请求运行时终止它以一种不寻常的方式。但这是一个未定义的行为 - 您的结果可能会有所不同。

+0

雅我编译它,并得到了警告----可疑的指针转换。但运行这个程序后,我得到了j作为答案。 – kTiwari 2012-07-23 17:22:24

+0

,还有一个人认为你建议我的代码和我在那里发布的代码是一样的,尽管有人认为你在那里做了主要的int。并返回0到操作系统 – kTiwari 2012-07-23 17:26:16

+0

忘了添加''const''。修复。 – 2012-07-23 17:26:49

1

你不理解为什么使用多重间接是因为多重间接在这里没有意义;这只是这个代码中的许多问题之一。

"hello"是字符串文字,这也是一个数组表达,特别是“的char 6-元件阵列”,这在该上下文中被转换(“衰变”)的指针char; p被声明为

char *p = "hello"; 

表达++*p++尝试递增事情p点(在此情况下,字符h),和作为副作用前进p以指向下一个字符。修改字符串文字的行为是undefined;取决于平台,字符串文字可能不可写,并且表达式++*p++可能会导致访问冲突。

以下是上面的程序,这给预期的结果的修正版本:

#include <stdio.h> 

int main(void) 
{ 
    char h[] = "hello"; 
    char *p = h; 
    printf("%c\n", ++*p++); 
    return 0; 
} 

而不必p指向一个字符串的,我们把它指向一个已经初始化为本地缓冲区字符串文字的内容

+0

先生,我可以知道术语副作用,你用兔子。 – kTiwari 2012-07-23 18:48:20

+0

@krishnaChandra:“副作用”仅仅意味着由于评估表达式而改变了某些东西。例如,假设'y = 0'和'x = 1'。表达式'y = x ++'有两个副作用 - 由于评估表达式而修改了'y'和'x'。 'y'得到值1(增量前的'x'的值),'x'得到值2(增量后的新值)。表达式'++ * p ++'也有两个副作用;指针'p'和它指向的东西都加1。 – 2012-07-23 19:19:32

+0

sir您能否给我提供一些链接,以帮助我了解副作用的细节。 – kTiwari 2012-07-23 19:22:13

2

该代码没有有意义的输出为C代码。代码简直是无效的。

首先,void main不是C中main函数的有效声明。main必须声明为返回int

其次,初始化无效。字符串文字衰减为C中的类型为char *。类型char *的值不能用于初始化类型为char ***的对象。

第三,解除引用一个指针char ***产生char **类型的指针值,该值不能printf -ed与%c格式说明。