Jobs being skipped after job with condition always()

name: CI/CD

on: [push]

jobs:
  a:
    runs-on: ubuntu-latest
    steps:
      - run: echo "a"
  b:
    runs-on: ubuntu-latest
    needs: a
    steps:
      - run: exit 1
  c:
    runs-on: ubuntu-latest
    needs: b
    if: always()
    steps:
      - run: echo "c"

  d:
    runs-on: ubuntu-latest
    needs: c
    steps:
      - run: echo "c"

Edit:
The following if block works:

      always() &&
      needs.c.result == 'success' &&
      needs.c.result != 'failure'