最近在一次采访中有一个以下客观类型的问题.
int a = 0;
cout << a++ << a;
Run Code Online (Sandbox Code Playgroud)
回答:
一个.10
b.01
c.未定义的行为
我回答了选择b,即输出为"01".
但令我惊讶的是,一位采访者告诉我,正确的答案是选项c:undefined.
现在,我确实知道C++中序列点的概念.以下语句的行为未定义:
int i = 0;
i += i++ + i++;
Run Code Online (Sandbox Code Playgroud)
但根据我对该陈述的理解cout << a++ << a,ostream.operator<<()将被召唤两次,先是ostream.operator<<(a++)后来ostream.operator<<(a).
我还检查了VS2010编译器的结果,其输出也是'01'.
这就是我认为++运营商所做的
a++; // a+=1 after calculating this line++a; // a+=1 before calcuating this line我正在努力学习指针,我认为我误解了一些东西.
int a=10;
int arr[3]={0,1,2};
int *ptr;
ptr=arr;
printf("%d,%d,%d,%d\n",a++,a++,++a,++a);
printf("%d,%d,%d\n", ptr[0],ptr[1],ptr[2]);
printf("%d,%d,%d,%d,%d,%d", * ptr++, ( * ptr)++, ++ * ptr, ++( * ptr), *++ptr, * ptr);
Run Code Online (Sandbox Code Playgroud)
我期望输出为:
12, 12, 12, 12
0,1,2
3,3,3,3,3,3,3
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.就是这样:
13,12,14,14
0,1,2
4,3,2,2,2,2
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我有以下代码片段:
main( )
{
int k = 35 ;
printf ( "\n%d %d %d", k == 35, k = 50, k > 40 ) ;
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出
0 50 0
Run Code Online (Sandbox Code Playgroud)
我不知道我理解的第一个值怎么printf来0.当值k与之比较时35,理想情况下它应该返回(并因此打印)1,但它如何打印为零?产生的其他两个值 - 50并且0都是正确的,因为在第二个值中,k的值被视为50,而对于第三个值,k的值(即35)被比较40.因为35 < 40,所以它打印0.
任何帮助将不胜感激,谢谢.
**更新**
在研究了关于这个主题的更多内容之后undefined behavior,我在一本关于C的书中看到了这一点,最后给出了源代码.
调用约定 调用约定表示在遇到函数调用时参数被传递给函数的顺序.这里有两种可能性:
C语言遵循第二顺序.
考虑以下函数调用:
fun (a, b, c, d ) ;
Run Code Online (Sandbox Code Playgroud)
在这个调用中,参数是从左向右还是从右向左传递并不重要.但是,在某些函数调用中,传递参数的顺序成为一个重要的考虑因素.例如:
int a = 1 ;
printf …Run Code Online (Sandbox Code Playgroud) 今天我重新审视了Pre Increment和Post Increment.
我知道的基本定义.
预增量 - 增加值并返回值.
后递增 - 递增值并在递增之前返回值.
但是做一些他们的组合我很难过.
使用基本的C程序,这是我测试的.
最初i = 0.
第一次测试
printf("%d %d",++i,++i);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
2 2
Run Code Online (Sandbox Code Playgroud)
我期望:
1 2
Run Code Online (Sandbox Code Playgroud)
第二次测试
printf("%d %d",i++,i++);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
1 0
Run Code Online (Sandbox Code Playgroud)
我期望:
0 1
Run Code Online (Sandbox Code Playgroud)
第三次测试
printf("%d %d",i++,++i);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
1 2
Run Code Online (Sandbox Code Playgroud)
我期望:
0 2
Run Code Online (Sandbox Code Playgroud)
第四次测试
printf("%d %d",++i,i++);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
2 0
Run Code Online (Sandbox Code Playgroud)
我期望:
1 1
Run Code Online (Sandbox Code Playgroud)
我认为评估可能来自右侧或左侧.在Post增量的情况下,如果是Pre Increment,则可能是左边的.也许Pre Increment的优先级高于Post增量.一些与结果相匹配的想法,但在一次测试中做出的假设并不能解释其他输出.