相关疑难解决方法(0)

cout << a ++ << a ;?的正确答案是什么?

最近在一次采访中有一个以下客观类型的问题.

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'.

c++ c++-faq

98
推荐指数
3
解决办法
8281
查看次数

多个'++'在变量和指针中工作

这就是我认为++运营商所做的

  1. a++; // a+=1 after calculating this line
  2. ++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)

为什么是这样?

c

1
推荐指数
2
解决办法
191
查看次数

如何在printf占位符中使用等于表达式?

我有以下代码片段:

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)

我不知道我理解的第一个值怎么printf0.当值k与之比较时35,理想情况下它应该返回(并因此打印)1,但它如何打印为零?产生的其他两个值 - 50并且0都是正确的,因为在第二个值中,k的值被视为50,而对于第三个值,k的值(即35)被比较40.因为35 < 40,所以它打印0.

任何帮助将不胜感激,谢谢.

**更新**

在研究了关于这个主题的更多内容之后undefined behavior,我在一本关于C的书中看到了这一点,最后给出了源代码.

调用约定 调用约定表示在遇到函数调用时参数被传递给函数的顺序.这里有两种可能性:

  1. 参数可能从左向右传递.
  2. 参数可能从右到左传递.

C语言遵循第二顺序.

考虑以下函数调用:

fun (a, b, c, d ) ;
Run Code Online (Sandbox Code Playgroud)

在这个调用中,参数是从左向右还是从右向左传递并不重要.但是,在某些函数调用中,传递参数的顺序成为一个重要的考虑因素.例如:

int a = 1 ;
printf …
Run Code Online (Sandbox Code Playgroud)

c printf equality undefined-behavior assignment-operator

1
推荐指数
1
解决办法
420
查看次数

预增量和后增量

今天我重新审视了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增量.一些与结果相匹配的想法,但在一次测试中做出的假设并不能解释其他输出.

c undefined-behavior pre-increment post-increment

-1
推荐指数
1
解决办法
789
查看次数