* s ++会发生什么?

时间:2019-03-02 14:55:49

标签: c

#include <string.h>
#include <stdio.h>

#define bool int
#define true 1
#define false 0

static bool is_digit(char c){
    return c > 47 && c < 58;
}

static bool is_all_digit(char *s){
    while(s){
        if(is_digit(*s++)){
            continue;
        }
        return false;
    }
    return true;
}


int main(){
    char *s = "123456";
    int i;
    printf("len = %d\n", strlen(s));
    for(i = 0; i<strlen(s); ++i){
        printf("%c : %s\n", *s, is_digit(*s++)? "true" : "false");
        //printf("%c : %s\n", s[i], is_digit(s[i])? "true" : "false");
    }
    return 0;
}

我想将功能作为注释部分实现。 但是结果如下:enter image description here

以3结尾,并且4〜6消失。 我的运行环境是win10 gcc 6.3.0

2 个答案:

答案 0 :(得分:3)

这有很多问题。

  1. 您使用错误的格式字符串printfUse %zu for a size_t, not %d

  2. 您的printf具有未定义的行为,因为您在同一表达式中具有*s*s++,并且它们之间没有sequence point

  3. 您将在循环的每次迭代中重新计算strlen(s),并且该值会不断下降,因为您不断增加s。在您开始之前,我会将strlen(s)缓存到名为n(或类似名称)的变量中,因为n不会改变。

我的编译器警告我除第三个错误以外的所有错误。

该程序有效:

#include <string.h>
#include <stdio.h>

#define bool int
#define true 1
#define false 0

static bool is_digit(char c){
    return c > 47 && c < 58;
}


int main(){
    const char *s = "123456";
    size_t i;
    const size_t n = strlen(s);
    printf("len = %zu\n", n);
    for(i = 0; i<n; ++i){
        printf("%c : %s\n", *s, is_digit(*s)? "true" : "false");
        s++;
    }
    return 0;
}

live demo

您也可以完全跳过strlen,而只是寻找一个空终止符:

#include <string.h>
#include <stdio.h>

#define bool int
#define true 1
#define false 0

static bool is_digit(char c){
    return c > 47 && c < 58;
}


int main(){
    const char *s = "123456";
    while (*s) {
        printf("%c : %s\n", *s, is_digit(*s)? "true" : "false");
        s++;
    }
    return 0;
}

live demo

答案 1 :(得分:3)

for(i = 0; i<strlen(s); ++i){
    s++;
}

在此for循环中,i在增加,但是strlen(s)在减少。 因为operator ++更改了指针s; (s++

首先,s表示整个字符串“ 123456”; 但是在循环之后,指针s作为一个字节移动。因此s表示“ 23456”。 因此,strlen(s)现在返回5。

打印“ 3”后,strlen(s)返回3。i也是3。 这样for循环就结束了。

表达式*s++仅表示*“增加并取消引用”(编辑:“增加并取消引用”。) 这将有所帮助:https://en.cppreference.com/w/cpp/language/operator_precedence

感谢阅读。