关于#c语言#的问题,请各位专家解答!


#include 
int main(void)
{
    int n = 5, k;
    k = (++n) + (++n) + (n++);
    printf("%d,%d\n", k, n);
    return 0;
}

最后k的值为什么是21?

这个值是不确定的,不同的编译器结果都不同
因为这是C语言未定义行为
参考:https://www.cnblogs.com/jaydenhpj/p/4432677.html

在表达式 (++n) + (++n) + (n++) 中:

++n 表示先对 n 进行自增操作,再将自增后的结果再次赋值给 n,因此第一次计算时,n 的值变成了 6,同时 ++n 的值也变成了 6,即 ++n 表达式的值为 6。
进行第二次计算时,n 的值已经变成了 6,因此 ++n 的值为 7,表达式变为 6 + 7。
进行第三次计算时,n 的值变成了 7,但是此时之前的 ++n 表达式已经计算完成,因此这里使用的是 n++ 表达式的值,即 7,此时计算结果为 6 + 7 + 7,结果为 20。
因为 n = 7,所以最终 k 的值为 20 + 7 = 21。所以程序输出 21,7。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7549377
  • 这篇博客你也可以参考下:C语言实现:编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。
  • 除此之外, 这篇博客: 南京大学_计算机系_夏令营_机试中的 1. 输入一串数字,移除 k 个数字,数字相对位置不变,使得剩下的数字组成最小的数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 输入:

    12321

    3

    输出:

    11

    输入:

    12

    1

    输出:

    1

    /**
     * 思路:最长上升子序列的变种
     *      每遍历到字符串中的字符,若存在比当前字符大的字符,则删除之
     *      直到删除的个数已为k 或遍历到了 最后一个字符为止
     * 
    */
    
    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    
    int main() {
    
        string num;
        int k;
        cin >> num >> k;
        if(k == 0) {
            cout << num;
            return 0;
        }
    
        int len = num.length();
        int finalLen = len - k;
        if(finalLen <= 0) {
            cout << "";
            return 0;
        }
        int flag[len];
        memset(flag,0,sizeof(flag));
    
        int i = 1;
        int j = 0;
        // 有可能存在 12345 这种删除字符数目不够k 的情况
        // 则将前 len - k 个 字符打印之
        while(i < len && k > 0) {
    
            int a = num[i] - '0';
            for(int j = 0;j < i;j++) {
                int b = num[j] - '0';
                if(a < b && flag[j] == 0) {
                    flag[j] = 1;
                    k--;
                    if(k == 0) {
                        break;
                    }
                }
            }
            i++;
        }
    
        for(int i = 0;i < len;i++) {
            if(flag[i] == 0 && finalLen > 0) {
                cout << num[i];
                finalLen--;
            }
        }
    
        return 0;
    }
    
  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法一课程中的 查找链表中的倒数第k个元素小节, 巩固相关知识点