user-0 提问: 笔试题求指导

回复:
user: user-1
content: 好奇怪的题目啊、、、什么是未定义行为？为什么s++ 后是4 那*s 不应该也是4么？菜鸟对这个问题很感兴趣，望大神耐心讲解一下~~

user: user-2
content: 这提的答案应该是 未定义行为，给数字就答错了。

user: user-3
content: 引用 24 楼 luoxuechengbing 的回复:[quote=引用 2 楼 nadleeh123 的回复:] [quote=引用 楼主 shineyan1991 的回复:] 今天笔试,考了这样一道题  #include <stdio.h>  int main(void)  { 	char *s="123456790"; 	printf("%c,%c",*(char *)((int *)s+++1),*s); 	return 0; }  第一反应,糟糕的代码,但是既然人家出了,我总不能空在哪吧 我写的结果是5,1 printf的调用约定必然是__cdecl,自右向左入栈的,所以右侧输出肯定是1啊;第一个参数中的子表达式s++虽然有求值顺序的问题,但是由于是自右向左入栈的,所以不影响这里的输出啊  可是面试官说是5,2 ,然后我就和他讲嘛,它还是不信,那就跑一下喽,他用的是vs2013,结果竟然是5,2 !!!! 我完全不敢相信啊,然后回家后用ideone在线的编译了一下,果然还是5,1!!! 难不成见鬼了,求教到底是什么原因???莫非vs2013的printf的调用约定不是__cdecl??!! *(char *)((int *)s+++1, 是int指针+1,实际是s+加sizeof(int)个字节,再转回去是字符5,这个好理解,关键就在后面那个s上了.后面的s到底加1还是没加，欢迎各种精通C标准的来讨论。  [/quote]  不对，说错了》。   我看上去 直接认为 是。。。。 s++(+1);怎么就把 int的大小给算进来了。不懂。   可否耐心解释下？[/quote] 自己代码码一下 就知道 不同指针类型 直接+1，看看编译器是不是加的sizeof（类型）

user: user-4
content: 要是考我这样的问题，我该怎么办啊

user: user-5
content: VC6环境  VS2010环境  VS2013环境  不同编译器，结果不一样。 最后说一句，遇到出这样“灰色地带”题目的傻逼公司，楼主，你直接走就行，考这样的面试题目，即使通过面试了，对你以后的发展也没什么好处。

user: user-6
content: 引用 2 楼 nadleeh123 的回复:[quote=引用 楼主 shineyan1991 的回复:] 今天笔试,考了这样一道题  #include <stdio.h>  int main(void)  { 	char *s="123456790"; 	printf("%c,%c",*(char *)((int *)s+++1),*s); 	return 0; }  第一反应,糟糕的代码,但是既然人家出了,我总不能空在哪吧 我写的结果是5,1 printf的调用约定必然是__cdecl,自右向左入栈的,所以右侧输出肯定是1啊;第一个参数中的子表达式s++虽然有求值顺序的问题,但是由于是自右向左入栈的,所以不影响这里的输出啊  可是面试官说是5,2 ,然后我就和他讲嘛,它还是不信,那就跑一下喽,他用的是vs2013,结果竟然是5,2 !!!! 我完全不敢相信啊,然后回家后用ideone在线的编译了一下,果然还是5,1!!! 难不成见鬼了,求教到底是什么原因???莫非vs2013的printf的调用约定不是__cdecl??!! *(char *)((int *)s+++1, 是int指针+1,实际是s+加sizeof(int)个字节,再转回去是字符5,这个好理解,关键就在后面那个s上了.后面的s到底加1还是没加，欢迎各种精通C标准的来讨论。  [/quote]  不对，说错了》。   我看上去 直接认为 是。。。。 s++(+1);怎么就把 int的大小给算进来了。不懂。   可否耐心解释下？

user: user-6
content: 引用 2 楼 nadleeh123 的回复:[quote=引用 楼主 shineyan1991 的回复:] 今天笔试,考了这样一道题  #include <stdio.h>  int main(void)  { 	char *s="123456790"; 	printf("%c,%c",*(char *)((int *)s+++1),*s); 	return 0; }  第一反应,糟糕的代码,但是既然人家出了,我总不能空在哪吧 我写的结果是5,1 printf的调用约定必然是__cdecl,自右向左入栈的,所以右侧输出肯定是1啊;第一个参数中的子表达式s++虽然有求值顺序的问题,但是由于是自右向左入栈的,所以不影响这里的输出啊  可是面试官说是5,2 ,然后我就和他讲嘛,它还是不信,那就跑一下喽,他用的是vs2013,结果竟然是5,2 !!!! 我完全不敢相信啊,然后回家后用ideone在线的编译了一下,果然还是5,1!!! 难不成见鬼了,求教到底是什么原因???莫非vs2013的printf的调用约定不是__cdecl??!! *(char *)((int *)s+++1, 是int指针+1,实际是s+加sizeof(int)个字节,再转回去是字符5,这个好理解,关键就在后面那个s上了.后面的s到底加1还是没加，欢迎各种精通C标准的来讨论。  [/quote]     问个比较傻缺的问题，为什么  是  s+sizof(int)；       小白看着只知道是， s+(s+1)然后转 int*,然后在转char*   各位不要见笑，我太水了。。平时只去 灌水，，今天。。。。

user: user-7
content: 就是 5 和 1 啊！ （int*）这是一个整形的指针，指针加1 就是加一个步长，int是4个字节，就s++ 后就到4 了，在加1 就到5了

user: user-8
content: 未定义行为，考察你的基础了。

user: user-9
content: 可能是考你先要确定选择哪个编译器。

user: user-6
content: 翻了下书，发现学的全忘了。。。。哎，可悲啊。

user: user-10
content: 兄弟，不是我看不起你，虽然我从没面过试，我也没做过老师，但是这种题目出出来，对吧，有半点意思吗？ 你也好意思拿出来问？C语言刚入门的人都能告诉你，这种题目的编程方式，了解下就算了，拿出来当题目，整个公司的实力也就能知道了

user: user-11
content: 奇葩题目

user: user-12
content: 首先是运算符优先级的问题。 其次是两个表达式谁先计算的问题........

user: user-13
content: 学习了

user: user-14
content: 这个和编译器的计算方式有关，vs2010下也是5,2 它是从左往右算的；

user: user-15
content: 引用 18 楼 ilikehigame 的回复:引用 13 楼 a515360208 的回复:[quote=引用 10 楼 ilikehigame 的回复:] 这个和编译器的计算方式有关，vs2010下也是5,2 它是从左往右算的；不是吧， 你把输出的两个位置换一下，还是2,5好不 你可是试一下看看是1,5还是2,5，光说没用运行一下就知道了！[/quote]既然敢说自然就是运行了的， ，在自己不确定的情况下要先确定

user: user-14
content: 引用 13 楼 a515360208 的回复:引用 10 楼 ilikehigame 的回复:这个和编译器的计算方式有关，vs2010下也是5,2 它是从左往右算的；不是吧， 你把输出的两个位置换一下，还是2,5好不 你可是试一下看看是1,5还是2,5，光说没用运行一下就知道了！

user: user-16
content: 标准的未定义行为

user: user-17
content: 如果int  是兩個字節的系統呢？？？？？？？？？ 答案是毛啊！