【问题标题】:Difference between ++*argv, *argv++, *(argv++) and *(++argv)++*argv、*argv++、*(argv++) 和 *(++argv) 之间的区别
【发布时间】:2015-01-10 05:16:04
【问题描述】:

目前我正在学习 C 并试图理解这些说明。它们真的不同吗?

++*argv

*argv++

*(++argv)

*(argv++)

谢谢!

【问题讨论】:

  • 检查operator precedence 表。
  • 你不明白什么?你知道前增量运算符和后增量运算符是做什么的吗?你知道优先级吗?
  • 你知道n++;++n;的区别吗?指出你不明白的部分。
  • 是的。问题是,如果我没记错的话,++ 的优先级高于 *。然后,调用 ++*argv 分解为:1.增加 argv,2.指向它。但事实并非如此。为什么?
  • @antikbd 否。这种不同的优先级仅适用于*x++ 情况。对于++*x++ 显然适用于*x。所以*首先被执行,然后++

标签: c arrays pointers command-line-arguments


【解决方案1】:

看看下面的代码。

main()
    {

       int a[4] = { 10,20,30,40};
       int *argv = a;
       t = ++*argv; 
       printf("%d\n",*argv); /* Here *argv is 11 */
        printf("%d\n",t); /* Here t is 11 because of pre-increment */

       *argv++; /* argv is incremented first ++ has higher priority over "*" */ 
       printf("%d\n",*argv);/* *argv is printed which is 20 */

       *(++argv); /* argv is incremented first ++ has higher priority over "*" */ 
       printf("%d\n",*argv); /* *argv is 30 */

       *(argv++); /* As explained above the same applies here also */
       printf("%d\n",*argv);
    }

【讨论】:

    【解决方案2】:

    后缀自增操作符的优先级高于指针解引用操作符,而不是前缀自增操作。所以这两个是等价的:

    *p++  *(p++)
    

    前缀增量与*具有相同的优先级,因此*++p会增加指针,与*(++p)相同。此外,++*p 与 ++(*p) 相同。

    【讨论】:

    • 又短又甜。谢谢。 +1。
    【解决方案3】:

    当你在赋值中使用前自增和后自增运算符,即 ++argv 和 argv++ 时,你必须了解右值和 lvlue。比如变量值是先递增然后分配给 LHS 还是在分配之后到LHS变量值递增。括号也改变了优先级。所以需要理解优先级、左值和r值的概念,以及指针递增的规则。

    【讨论】:

      【解决方案4】:

      两个递增的小例子。
      提示:为了更好地理解,请尝试将 argc 想象为 1 或 2。

      后增量

      在下面的程序中,打印所有参数包括程序名称argv[0]

      int
      main(int argc, char **argv)
      {
          while (argc--)
              printf("%s\n", *argv++); /* same as *(argv++) */
      }
      

      预增量

      在下面的程序中,所有参数都打印出来程序名称除外argv[0]

      int
      main(int argc, char **argv)
      {
          while (--argc)
              printf("%s\n", *(++argv));
      }
      

      ++*argv 增加值*argv

      【讨论】:

        猜你喜欢
        • 2011-01-02
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2014-09-22
        • 2015-01-28
        • 2014-12-02
        • 2011-07-08
        • 2015-12-21
        相关资源
        最近更新 更多